有没有办法从图像中提取扭曲的矩形/正方形?

0 投票
1 回答
613 浏览
提问于 2025-06-18 03:57

这是一个图片,我想把这个矩形或正方形的边缘填满,这样我就可以用轮廓来裁剪它。到目前为止,我做的事情是使用了Canny边缘检测器来找到边缘,然后用位运算中的“或”操作(bitwise_or)来稍微填充这个矩形,但并没有完全填满。请问有什么办法可以填满这个矩形,或者有没有直接裁剪的方式呢?

image = cv2.imread('C:/Users/hp/Desktop/segmentation/test3.jpeg')

img3 = img2 = image.copy()
image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
img3 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)

lower = np.array([155,25,0])
upper = np.array([179,255,255])
mask = cv2.inRange(image, lower, upper)

edges = cv2.Canny(mask, 1, 255, apertureSize=7)
result = cv2.bitwise_or(edges, mask)



相关问题:

  • 暂无相关问题
暂无标签

1 个回答

3

这里有一种方法可以在Python/OpenCV中提取矩形白色像素的边界。

  • 读取输入的图像
  • 将图像转换为灰度图
  • 进行阈值处理
  • 使用Canny边缘检测
  • 获取霍夫线段并在黑色背景上绘制为白色
  • 获取白色像素的边界
  • 根据边界裁剪输入图像

输入图像:

这里输入图片描述

import cv2
import numpy as np

# load image as grayscale
img = cv2.imread('rect_lines.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# threshold 
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY)[1]

# apply canny edge detection
edges = cv2.Canny(thresh, 100, 200)

# get hough line segments
threshold = 100
minLineLength = 50
maxLineGap = 20
lines = cv2.HoughLinesP(thresh, 1, np.pi/360, threshold, minLineLength, maxLineGap)

# draw lines
linear = np.zeros_like(thresh)
for [line] in lines:
    #print(line)
    x1 = line[0]
    y1 = line[1]
    x2 = line[2]
    y2 = line[3]
    cv2.line(linear, (x1,y1), (x2,y2), (255), 1)

# get bounds of white pixels
white = np.where(linear==255)
xmin, ymin, xmax, ymax = np.min(white[1]), np.min(white[0]), np.max(white[1]), np.max(white[0])
#print(xmin,xmax,ymin,ymax)

# draw bounding box on input
bounds = img.copy()
cv2.rectangle(bounds, (xmin,ymin), (xmax,ymax), (0,0,255))

# crop the image at the bounds
crop = img[ymin:ymax, xmin:xmax]

# save resulting masked image
cv2.imwrite('rect_lines_edges.png', edges)
cv2.imwrite('rect_lines_hough.png', linear)
cv2.imwrite('rect_lines_bounds.png', bounds)
cv2.imwrite('rect_lines_crop.png', crop)

# display result, though it won't show transparency
cv2.imshow("thresh", thresh)
cv2.imshow("edges", edges)
cv2.imshow("lines", linear)
cv2.imshow("bounds", bounds)
cv2.imshow("crop", crop)
cv2.waitKey(0)
cv2.destroyAllWindows()


Canny边缘检测结果:

这里输入图片描述

霍夫线段结果:

这里输入图片描述

输入图像上的边界框:

这里输入图片描述

裁剪后的图像:

这里输入图片描述

撰写回答