我想获取轮廓区域颜色范围并执行一些条件,例如这是输入图像:
下面是查找轮廓的代码:
import cv2
img = cv2.imread('D:/original.png', cv2.IMREAD_UNCHANGED)
#convert img to grey
img_grey = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
#set a thresh
thresh = 100
#get threshold image
ret,thresh_img = cv2.threshold(img_grey, thresh, 255, cv2.THRESH_BINARY)
#find contours
contours, hierarchy = cv2.findContours(thresh_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
现在,我尝试获取每个轮廓颜色并写入条件,例如:
如果轮廓[0]在颜色范围((100,100,100),(200,200,200))内,则绘制轮廓
我想做的事情就是:获取每个轮廓区域并检查所选轮廓是否在特定颜色范围内。
2条答案
按热度按时间i7uq4tfw1#
为了提取通过颜色区分的单个轮廓,处理该问题的逻辑方式将是使用不同的颜色并且不将图像转换为
grayscale
。然后,您可以在单个通道上工作。例如,对于
blue
通道:然后结合
bit_wise
操作,您可以提取特定的轮廓。另一种方法是用
Canny
运算符替换threshold
运算符。生成以下轮廓:
OpenCV documentation建议使用
Canny
作为轮廓的预处理。rdlzhqv92#
我们可以从执行颜色聚类的cv2.kmeans开始-类似于following tutorial中所描述的。
结果是标签列表。
每个标签(标签0、标签1、...)表示属于特定颜色簇的所有像素。
将K均值应用于颜色聚类的示例:
迭代标签,并使用
255
创建遮罩,其中labels == k
:对于每个掩码,应用以下阶段:
x, y = tuple(c[0][0])
.color = original_image[y, x]
.cv2.drawContours(colored_mask, [c], 0, color.tolist(), -1)
.完整代码示例:
输出样本较少: