文章目录

  • ​​1、问题描述​​
  • ​​2、效果呈现​​
  • ​​3、思路​​
  • ​​3.1 HSV空间下提取​​
  • ​​3.2 使用掩膜与RGB三个通道分别做点乘​​
  • ​​3.3 使用图像与运算,比使用mask​​
  • ​​4、代码:​​
  • ​​5、补充:对数据集进行批量处理​​
  • ​​6 、补充:文件批处理重命名​​

1、问题描述

使用opencv提取图像红色。

2、效果呈现

使用python提取红色总共遇到了三种,但是有效只有一种

原图

图像处理-提取红色_Red


有效方法提取出的结果

图像处理-提取红色_数据集_02

3、思路

3.1 HSV空间下提取

思路:让RGB图像转化为HSV空间下图像,使用红色图像所在阈值进行提取。

结果:

图像处理-提取红色_图像处理_03


事实提取出来的是二值化图像,但是这里的二值化图像能够当成掩膜使用。

3.2 使用掩膜与RGB三个通道分别做点乘

思路:使用opencv提供的solit函数将RGB图像分成三个通道与mask做点乘,然后将结果合并

结果:

图像处理-提取红色_图像处理_04

3.3 使用图像与运算,比使用mask

思路:让原图像与mask作用

结果:

图像处理-提取红色_点乘_05

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库进行操作。

图像处理-提取红色_点乘_06


图像处理-提取红色_点乘_07


代码:

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)

结果:

图像处理-提取红色_Red_08

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)

图像处理-提取红色_数据集_09