如何在openCV Python中选择统一着色图的特定部分?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在openCV Python中选择统一着色图的特定部分?相关的知识,希望对你有一定的参考价值。

我有一个在MS Paint中绘制的蓝色十字图像。

https://imgur.com/cMjZrra

我希望能够从图像中提取十字架的四个独立臂,并将它们存储在四个单独的图像中。

我试过的是使用cv2.inRange()方法检测蓝色,如下面的代码:

        import cv2
        import numpy as np
        img=cv2.imread("PECross.png")
        blue=[
        ([250,0,0],[255,0,0])]
        for (lower, upper) in blue:
        lower=np.array(lower, dtype="uint8")
        upper=np.array(upper, dtype="uint8")
        mask=cv2.inRange(img,lower,upper)
        output=cv2.bitwise_and(img,img,mask=mask)
        cv2.imshow("Out",output)
        cv2.waitKey(0)
        cv2.destroyAllWindows()

然后显示提取的蓝色。它提取整个十字架,因为它的颜色相同,但我想分别提取十字架的四个臂。

我需要添加什么代码,分别提取十字架的四个臂?

答案

这是代码。它使用霍夫线来检测线条,而不仅仅是裁剪线条给出的图像区域

img = cv2.imread('PECross.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
lines_coords = []
edges = cv2.Canny(gray, 50,150,3)
lines = cv2.HoughLines(edges,1,np.pi/180,200)
for rho,theta in lines.squeeze():
    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))
    lines_coords.append((x1,y1,x2,y2))
vertical_left = lines_coords[0]
vertical_right = lines_coords[1]
horizontal_up = lines_coords[2]
horizontal_down = lines_coords[3]

x1,y1,x2,y2=vertical_left
left_arm = img[:, :x1]

x1,y1,x2,y2=vertical_right
right_arm = img[:, x1:]

x1,y1,x2,y2=horizontal_up
upper_arm = img[:y1, :]

x1,y1,x2,y2=horizontal_down
lower_arm = img[y1:, :]

cv2.imwrite('left_arm.png', left_arm)
cv2.imwrite('right_arm.png', right_arm)
cv2.imwrite('upper_arm.png', upper_arm)
cv2.imwrite('lower_arm.png', lower_arm)

以上是关于如何在openCV Python中选择统一着色图的特定部分?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 boost 为图的节点着色

OpenCV:是不是可以使用它执行 openGL 像素着色?

统一按钮在着色器中丢弃像素

如何在ggplot2中更改散点图的颜色

使用数据框中的列为 seaborn 图的背景着色

将统一值传递给顶点和片段着色器