1、问题描述
使用opencv提取图像红色。
2、效果呈现
使用python提取红色总共遇到了三种,但是有效只有一种
原图
有效方法提取出的结果
3、思路
3.1 HSV空间下提取
思路:让RGB图像转化为HSV空间下图像,使用红色图像所在阈值进行提取。
结果:
事实提取出来的是二值化图像,但是这里的二值化图像能够当成掩膜使用。
3.2 使用掩膜与RGB三个通道分别做点乘
思路:使用opencv提供的solit函数将RGB图像分成三个通道与mask做点乘,然后将结果合并
结果:
3.3 使用图像与运算,比使用mask
思路:让原图像与mask作用
结果:
4、代码:
import numpy as np
import cv2 as cv
def GetMask(img):
"""
提取图中的红色部分
"""
#转化为hsv空间
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
print(hsv.shape)
#颜色在HSV空间下的上下限156-180还能改成0-10
low_hsv = np.array([156, 43, 46])
high_hsv = np.array([180, 255, 255])
#使用opencv的inRange函数提取颜色
mask = cv.inRange(hsv, lowerb=low_hsv, upperb=high_hsv)
cv.imshow("s",mask)
cv.waitKey()
return mask;
def getRed(mask,img):
B,G,R = cv.split(img)
B = B*mask
G = G*mask
R = R*mask
Red = cv.bitwise_and(img,img,mask=mask)
Red0 = cv.merge([B,G,R])
return Red
def Preprocess(img):
kernel = cv.getStructuringElement(0, (40, 40))
result = cv.morphologyEx(img, op=cv.MORPH_CLOSE, kernel=kernel)
return result;
if __name__=='__main__':
src = "./Result/result_11.jpg"
img = cv.imread(src)
#红色提取出来
mask = GetMask(img)
Red = getRed(mask,img)
cv.imshow("Red",Red)
cv.waitKey()