python - 有什么方法可以从图像中提取变形的矩形/正方形?

标签 python image opencv image-processing cv2

Image

这是图像,我想填充此矩形或正方形的边缘,以便可以使用轮廓对其进行裁剪。到目前为止,我所做的是我使用了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)



最佳答案

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

  • 读取输入的
  • 转换为灰色
  • 阈值
  • 做Canny边缘检测
  • 获取霍夫线段并在黑色背景上绘制为白色
  • 获取白色像素的边界
  • 将输入裁剪到边界

  • 输入:

    enter image description here
    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 边缘:

    enter image description here

    粗线段:

    enter image description here

    输入的边界框:

    enter image description here

    裁剪图片:

    enter image description here

    关于python - 有什么方法可以从图像中提取变形的矩形/正方形?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61875475/

    相关文章:

    html - 如何使用 html 和 css 像这样裁剪和设计这些图像?

    CSS:如何创建框作为图片的容器

    c++ - Visual Studio 2012

    python - 如何在 python 中的 OpenCv 中添加自定义 Keras 模型

    python - 如何从图像中裁剪边界框

    python - 为什么列表结果与预期不同?

    python - 在 django 和 aws 中使用 crontab 发送数千封电子邮件

    cocoa-touch - 如何在 cocoa 代码中为 uitabbarcontroller 设置图像

    javascript - 检查邮件是否已读,gmail api

    python - 使用Python在UDP客户端-服务器中打印消息时的编码问题