提示:深度学习中涉及到的opencv图像处理知识点及代码运用。主要分为功能运用+知识点补充
内容持续更新ing。。。
# coding=gbk
import cv2
img = cv2.imread("8691.jpg")
#转化为灰度图,提取灰度阈值为117-255的感兴趣区域
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# threshold函数返回的第一个参数为阈值,第二个为结果图像
ret, binary = cv2.threshold(gray, 117, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, contours, -1, (0, 0, 255), 2) #通过轮廓返回值contours绘制轮廓,指定轮廓为所以轮廓红色厚度为2的轮廓
print(contours, hierarchy)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.THRESH_BINARY:
二值化阈值处理会将原始图像处理为仅有两个值的二值图像,其针对像素点的处理方式为:在8位图像中,最大值是255。因此,在对8位灰度图像进行二值化时,如果将阈值设定为127,那么:所有大于127的像素点会被处理为255。 其余值会被处理为0。
cv2.findContours() 返回轮廓本身和每条轮廓对应的属性 。
- 第一个参数是寻找轮廓的图像;
- 第二个参数表示轮廓的检索模式,有四种(本文介绍的都是新的cv2接口):
cv2.RETR_EXTERNAL 表示只检测外轮廓
cv2.RETR_LIST 检测的轮廓不建立等级关系
cv2.RETR_CCOMP 建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。
cv2.RETR_TREE 建立一个等级树结构的轮廓。- 第三个参数method为轮廓的近似办法
cv2.CHAIN_APPROX_NONE 存储所有的轮廓点,相邻的两个点的像素位置差不超过1,即max(abs(x1-x2),abs(y2-y1))==1
cv2.CHAIN_APPROX_SIMPLE 压缩水平方向,垂直方向,对角线方向的元素,只保留该方向的终点坐标,例如一个矩形轮廓只需4个点来保存轮廓信息
cv2.CHAIN_APPROX_TC89_L1,CV_CHAIN_APPROX_TC89_KCOS 使用teh-Chinl chain 近似算法
# coding=gbk
import cv2
# 读取图片并缩放方便显示
img = cv2.imread(r'D:\y\XM\yolov5-master\mydata1\images\train\000010.png')
height, width = img.shape[:2]
size = (int(width * 0.5), int(height * 0.5))
# 缩放
img = cv2.resize(img, size, interpolation=cv2.INTER_AREA)
# BGR转化为HSV
HSV = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 鼠标点击响应事件
def getposHsv(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
print("HSV is", HSV[y, x])
def getposBgr(event, x, y, flags, param):
if event == cv2.EVENT_LBUTTONDOWN:
print("Bgr is", img[y, x])
cv2.imshow("imageHSV", HSV)
cv2.imshow('image', img)
cv2.setMouseCallback("imageHSV", getposHsv)
cv2.setMouseCallback("image", getposBgr)
cv2.waitKey(0)
# coding=gbk
import cv2
import numpy as np
img=cv2.imread(r'D:\y\XM\yolov5-master\mydata1\images\train\000010.png')
#转化为HSV格式
HSV=cv2.cvtColor(img,cv2.COLOR_BGR2HSV)
#设定hsv上下限,获取范围内的mask码
lower=np.array([10,95,35]) # 黄色下
upper=np.array([45,200,255]) #黄色上
lower1=np.array([10,95,35]) #白色下
upper1=np.array([45,200,255]) #白色上
mask=cv2.inRange(HSV,lower,upper) # 提取黄色掩码
mask1=cv2.inRange(HSV,lower1,upper1) #提取白色掩码
mask2= mask+mask1 #合并黄色和白色掩码
#膨胀腐蚀操作
# kernel = np.array([[1,1,1,1,1],[1,1,1,1,1],[1,1,1,1,1],
# [1,1,1,1,1],[1,1,1,1,1]],dtype = np.uint8)/25 #高斯自定义5*5的卷积核
# erosion = cv2.erode(mask,kernel,iterations = 1) #膨胀
# dilation = cv2.dilate(mask,kernel,iterations = 1) #腐蚀
# opening = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) #开运算,先腐蚀再膨胀。
# mask2 = cv2.morphologyEx(mask2, cv2.MORPH_CLOSE, kernel) #闭运算,先膨胀再腐蚀。
#将掩码与原图像合并提取
result=cv2.bitwise_and(img,img,mask=mask2)
# #掩码与原图像取反
# result=cv2.bitwise_not(img,img,mask=mask2)
cv2.imshow('img',img)
cv2.imshow('mask',mask)
cv2.imshow('mask1',mask1)
cv2.imshow('mask2',mask2)
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyAllWindows()
HSV颜色模型
HSV(Hue, Saturation, Value)是根据颜色的直观特性由A. R. Smith在1978年创建的一种颜色空间, 也称六角锥体模型(Hexcone Model)。、这个模型中颜色的参数分别是:色调(H),饱和度(S),亮度(V)。
色调H:简单理解为什么颜色。用角度度量,取值范围为0°~360°,从红色开始按逆时针方向计算,红色为0°,绿色为120°,蓝色为240°。它们的补色是:黄色为60°,青色为180°,品红为300°;
饱和度S:简单理解为颜色深浅。取值范围为0.0~1.0;
亮度V:简单理解为颜色明暗。取值范围为0.0(黑色)~1.0(白色)。
HSV颜色分量范围
一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。
RGB与HSV的转换
在计算机视觉中,出于各种原因(例如对照明变化的鲁棒性或消除阴影),通常希望将颜色分量与强度分开。HSV在进行色彩分割时作用比较大。他包含着比RGB更多的色彩信息。通过阈值的划分,颜色能够被区分出来。
【RGB TO HSV】
def rgb2hsv(r, g, b):
r, g, b = r/255.0, g/255.0, b/255.0
mx = max(r, g, b)
mn = min(r, g, b)
df = mx-mn
if mx == mn:
h = 0
elif mx == r:
h = (60 * ((g-b)/df) + 360) % 360
elif mx == g:
h = (60 * ((b-r)/df) + 120) % 360
elif mx == b:
h = (60 * ((r-g)/df) + 240) % 360
if mx == 0:
s = 0
else:
s = df/mx
v = mx
return h, s, v
【HSV To RGB】
def hsv2rgb(h, s, v):
h = float(h)
s = float(s)
v = float(v)
h60 = h / 60.0
h60f = math.floor(h60)
hi = int(h60f) % 6
f = h60 - h60f
p = v * (1 - s)
q = v * (1 - f * s)
t = v * (1 - (1 - f) * s)
r, g, b = 0, 0, 0
if hi == 0: r, g, b = v, t, p
elif hi == 1: r, g, b = q, v, p
elif hi == 2: r, g, b = p, v, t
elif hi == 3: r, g, b = p, q, v
elif hi == 4: r, g, b = t, p, v
elif hi == 5: r, g, b = v, p, q
r, g, b = int(r * 255), int(g * 255), int(b * 255)
return r, g, b
【HSV 距离计算】
def HSVDistance(hsv_1,hsv_2):
H_1,S_1,V_1 = hsv_1
H_2,S_2,V_2 = hsv_2
R=100
angle=30
h = R * math.cos(angle / 180 * math.pi)
r = R * math.sin(angle / 180 * math.pi)
x1 = r * V_1 * S_1 * math.cos(H_1 / 180 * math.pi);
y1 = r * V_1 * S_1 * math.sin(H_1 / 180 * math.pi);
z1 = h * (1 - V_1);
x2 = r * V_2 * S_2 * math.cos(H_2 / 180 * math.pi);
y2 = r * V_2 * S_2 * math.sin(H_2 / 180 * math.pi);
z2 = h * (1 - V_2);
dx = x1 - x2;
dy = y1 - y2;
dz = z1 - z2;
return math.sqrt(dx * dx + dy * dy + dz * dz)
相关资源:
python–RGB转HSV_Ken的博客-CSDN博客_python rgb转hsv
OpenCV中HSV颜色模型及颜色分量范围 - wangyblzu - 博客园