图像处理-提取红色
原创
©著作权归作者所有:来自51CTO博客作者mb5dbc2345bf8de的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
- 1、问题描述
- 2、效果呈现
- 3、思路
- 3.1 HSV空间下提取
- 3.2 使用掩膜与RGB三个通道分别做点乘
- 3.3 使用图像与运算,比使用mask
- 4、代码:
- 5、补充:对数据集进行批量处理
- 6 、补充:文件批处理重命名
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 GetRed(img):
"""
提取图中的红色部分
"""
# 转化为hsv空间
hsv = cv2.cvtColor(img, cv2.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 = cv2.inRange(hsv, lowerb=low_hsv, upperb=high_hsv)
Red = cv2.bitwise_and(img, img, mask=mask)
return Red;
if __name__ == '__main__':
src = "Image/License.jpg"
img = cv.imread(src)
# 红色提取出来
Red = GetRed(img)
cv.imshow("Red", Red)
cv.waitKey()
5、补充:对数据集进行批量处理
目的:将以下三个文件夹中所有图片提取出红色。
思路:使用os库进行操作。
代码:
src = '/home/barry/Project/Part2/Project_2/part2_train'
dirs = os.listdir(src)
dirs.sort()
for i, dir in enumerate(dirs):
src0 = os.path.abspath(src)+'/'+dir
files = os.listdir(src0)
for i, dir2 in enumerate(files):
src1 = src0+'/'+dir2
img = cv2.imread(src1)
Red = GetRed(img)
cv2.imwrite(src1,Red)
结果:
6 、补充:文件批处理重命名
src = '/home/barry/Project/Part2/Project_2/part2_dataset/04'
dirs = os.listdir(src)
for i,dir in enumerate(dirs):
src0 = src+'/'+os.path.basename(dir)
target = src+'/'+str(i+1)+'.jpg'
os.rename(src0,target)