wgij007 发表于 2023-5-10 20:18:48

求一个图片捕捉框边的程序

原图


处理后



框选内的RGB值,导入一个二维列表中。
输入长边与短边的长度。(有数据就可)

感激!

isdkz 发表于 2023-5-10 20:19:33

您可以使用Python中的OpenCV库来实现这个程序。以下是实现的步骤:

1. 读取原始图像并将其转换为灰度图像。
2. 使用Canny边缘检测算法检测图像中的边缘。
3. 使用霍夫变换检测图像中的直线。
4. 根据直线的位置计算出边框的位置。
5. 从原始图像中提取边框内的像素值,并将其存储在一个二维列表中。

下面是Python代码示例:

import cv2

# 读取原始图像并转换为灰度图像
img = cv2.imread('original_image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Canny边缘检测
edges = cv2.Canny(gray, 50, 150, apertureSize=3)

# 霍夫变换检测直线
lines = cv2.HoughLines(edges, 1, cv2.cv2.PI/180, 200)

# 计算边框位置
for line in lines:
    rho, theta = line
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * (a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))

    # 绘制直线
    cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)

# 提取边框内的像素值并存储在二维列表中
box = []
for x in range(x1, x2):
    row = []
    for y in range(y1, y2):
      row.append(img)
    box.append(row)


其中, original_image.jpg 是原始图像的文件名。 x1 、 y1 、 x2 、 y2 是边框的位置。 box 是存储像素值的二维列表。您需要根据实际情况调整参数以获得最佳结果。

wgij007 发表于 2023-5-11 08:01:32

isdkz 发表于 2023-5-10 20:19
您可以使用Python中的OpenCV库来实现这个程序。以下是实现的步骤:

1. 读取原始图像并将其转换为灰度图像 ...

非常感谢您的回复
程序运行时出现下面错误,请问是那出问题了。

   lines = cv2.HoughLines(edges, 1, cv2.cv2.PI/180, 200)
AttributeError: module 'cv2.cv2' has no attribute 'PI'

isdkz 发表于 2023-5-11 08:49:11

wgij007 发表于 2023-5-11 08:01
非常感谢您的回复
程序运行时出现下面错误,请问是那出问题了。



对不起,我犯了一个错误。在 OpenCV 中并没有定义 π (PI),您可以直接使用 Python 的 math 库中的 π。所以,您应该将cv2.cv2.PI/180替换为math.pi/180 。

请看下面的修正后的代码:

import cv2
import numpy as np
import math

# 读取原始图像并转换为灰度图像
img = cv2.imread('original_image.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# Canny边缘检测
edges = cv2.Canny(gray, 50, 150, apertureSize=3)

# 霍夫变换检测直线
lines = cv2.HoughLines(edges, 1, math.pi/180, 200)

# 计算边框位置
for line in lines:
    rho, theta = line
    a = np.cos(theta)
    b = np.sin(theta)
    x0 = a * rho
    y0 = b * rho
    x1 = int(x0 + 1000 * (-b))
    y1 = int(y0 + 1000 * (a))
    x2 = int(x0 - 1000 * (-b))
    y2 = int(y0 - 1000 * (a))

    # 绘制直线
    cv2.line(img, (x1, y1), (x2, y2), (0, 0, 255), 2)

# 提取边框内的像素值并存储在二维列表中
box = []
for x in range(x1, x2):
    row = []
    for y in range(y1, y2):
      row.append(img)
    box.append(row)


我希望这可以解决您的问题!

天王干地虎 发表于 2023-5-11 14:14:47

这是chatGPT在互问互答吗

wgij007 发表于 2023-5-11 17:59:56

isdkz 发表于 2023-5-11 08:49
对不起,我犯了一个错误。在 OpenCV 中并没有定义 π (PI),您可以直接使用 Python 的 math 库中的 π ...

您好,还是有个报错

    for line in lines:
TypeError: 'NoneType' object is not iterable

好像是   函数返回值赋值没有 程序没看明

Axiujiu 发表于 2023-5-12 08:59:41

感激分享,认真学习。
页: [1]
查看完整版本: 求一个图片捕捉框边的程序