如何在openCV Python中选择统一着色图的特定部分?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在openCV Python中选择统一着色图的特定部分?相关的知识,希望对你有一定的参考价值。
我有一个在MS Paint中绘制的蓝色十字图像。
我希望能够从图像中提取十字架的四个独立臂,并将它们存储在四个单独的图像中。
我试过的是使用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中选择统一着色图的特定部分?的主要内容,如果未能解决你的问题,请参考以下文章