【深度学习之OpenCV视觉处理】

提示:深度学习中涉及到的opencv图像处理知识点及代码运用。主要分为功能运用+知识点补充
内容持续更新ing。。。

文章目录

  • 一、功能运用
    • 1.灰度值获取轮廓
    • 2.鼠标获取HSV值和RGB值
    • 3.利用hsv值获取mask码感兴趣区域
  • 二、知识点补充
    • 1.HSV颜色模型及颜色分量范围
    • 2、直方图


一、功能运用

1.灰度值获取轮廓

# 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 近似算法

2.鼠标获取HSV值和RGB值

# 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)

3.利用hsv值获取mask码感兴趣区域

# 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()

二、知识点补充

1.HSV颜色模型及颜色分量范围

  • 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(白色)。

【深度学习之OpenCV视觉处理】_第1张图片 【深度学习之OpenCV视觉处理】_第2张图片
  • HSV颜色分量范围
    一般对颜色空间的图像进行有效处理都是在HSV空间进行的,然后对于基本色中对应的HSV分量需要给定一个严格的范围,下面是通过实验计算的模糊范围(准确的范围在网上都没有给出)。

    H: 0— 180
    S: 0— 255
    V: 0— 255
    此处把部分红色归为紫色范围:
    【深度学习之OpenCV视觉处理】_第3张图片

  • 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)

2、直方图

  • 反映图像颜色的等级统计,其横坐标为图像中各个像素点的灰度级(0-255),纵坐标为该灰度级的像素个数
  • 归一化直方图,横坐标不变也是表示灰度级,纵坐标则是出现这个灰度级的概率

相关资源
python–RGB转HSV_Ken的博客-CSDN博客_python rgb转hsv
OpenCV中HSV颜色模型及颜色分量范围 - wangyblzu - 博客园

你可能感兴趣的:(opencv,计算机视觉,深度学习)