OpenCv中的图像处理-上

本文介绍了OpenCV中的图像处理,包括颜色空间转换、物体跟踪、几何变换(如扩展缩放、平移、旋转、仿射变换、透射变换)以及图像阈值、平滑等技术。重点讲解了HSV颜色空间的使用和图像阈值的种类,如自适应阈值和Otsu's二值化。还探讨了各种滤波方法,如平均滤波、高斯滤波、中值滤波和双边滤波的特性及其在图像处理中的应用。此外,文章还涵盖了形态学转换,如腐蚀、膨胀、开运算、闭运算等操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

颜色空间转换

在 OpenCV 中有超过 150 中进行颜色空间转换的方法。但是你以后就会发现我们经常用到的也就两种:BGR↔Gray 和 BGR↔HSV。我们要用到的函数是cv2.cvtColor(input_image,flag),其中 flag就是转换类型。

灰度图(Grayscale Image)是一种只有亮度信息而没有颜色信息的图像。在灰度图中,每个像素只有一个灰度值(或亮度值),通常在0到255之间表示。灰度图在计算机视觉和图像处理中应用广泛,包括:
(1) 特征提取:灰度图像可以更容易地提取图像的纹理、边缘、角点等特征,对于计算机视觉算法如目标检测、图像识别等任务有很大的帮助。
(2)去噪:灰度图像相对于彩色图像可以更容易地去除噪声,因为噪声通常表现为颜色上的变化。
(3)节省存储空间:灰度图像只需要一个字节(8位)来表示每个像素,而彩色图像则需要三个或四个字节(24或32位),因此灰度图像在存储和传输时更加高效。
(4)加速计算:在图像处理和计算机视觉任务中,灰度图像的处理速度通常比彩色图像要快,因为每个像素的信息量更小。

下面的代码的作用是列出OpenCV库中所有以"COLOR_"开头的常量。这些常量表示各种颜色空间转换的标志。通过查看这些标志,可以了解OpenCV支持哪些颜色空间的转换以及如何使用它们。

import cv2
flags = [i for i in dir(cv2) if i.startswith('COLOR_')]
print(flags)

注意的是在 OpenCV 的 HSV 格式中,H(色彩/色度)的取值范围是 [0,179],
S(饱和度)的取值范围 [0,255],V(亮度)的取值范围 [0,255]。但是不同的软件使用的值可能不同。所以当你需要拿 OpenCV 的 HSV 值与其他软件的 HSV 值进行对比时,一定要记得归一化。

物体跟踪(颜色)

根据HSV的颜色表达方式,

import cv2
import numpy as np
frame = cv2.imread("voice.PNG")
frame = cv2.resize(frame,(int(frame.shape[1]/2),int(frame.shape[0]/2)))
while(1):
    # 转换到 HSV
    hsv=cv2.cvtColor(frame,cv2.COLOR_BGR2HSV)
    # 设定蓝色的阈值
    lower_blue=np.array([110,50,50])
    upper_blue=np.array([130,255,255])
    # 根据阈值构建掩模
    #掩模操作后的图片只有0和255
    mask=cv2.inRange(hsv,lower_blue,upper_blue)
    # 对原图像和掩模进行位运算
    res=cv2.bitwise_and(frame,frame,mask=mask)
    # 显示图像
    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    k=cv2.waitKey(5)&0xFF
    if k==27:
        break
    # 关闭窗口
cv2.destroyAllWindows()

怎样找到跟踪对象的HSV数值?

当我们知道跟踪对象的RGB时候,就可以运行下面一段代码。

import cv2
import numpy as np
green=np.uint8([[[0,255,0]]])
hsv_green=cv2.cvtColor(green,cv2.COLOR_BGR2HSV)
print(hsv_green)

几何变换

OpenCV 提供了两个变换函数,cv2.warpAffine 和 cv2.warpPerspective,使用这两个函数你可以实现所有类型的变换。cv2.warpAffine 接收的参数是2 × 3 的变换矩阵,而 cv2.warpPerspective 接收的参数是 3 × 3 的变换矩。

扩展缩放

扩展缩放只是改变图像的尺寸大小。OpenCV 提供的函数 cv2.resize()可以实现这个功能。图像的尺寸可以自己手动设置,你也可以指定缩放因子。
cv2.resize()函数中的interpolation参数指定了在调整图像大小时使用的插值方法。常见的插值方法包括:

cv2.INTER_NEAREST:最近邻插值。
cv2.INTER_LINEAR:双线性插值(默认值)。
cv2.INTER_CUBIC:双立方插值。
cv2.INTER_AREA:区域插值。
cv2.INTER_LANCZOS4:Lanczos插值

需要在特定场合下要用特定的参数更好点。
INTER_NEAREST:最近邻插值算法,用于放大图像时不失真的需求,但图像质量比较粗糙。
INTER_LINEAR:双线性插值算法,是默认的插值算法,适用于图像缩小和放大,但放大时可能会失真。
INTER_CUBIC:双三次插值算法,适用于图像放大,比双线性插值更精确,但计算时间较长。
INTER_LANCZOS4:Lanczos插值算法,适用于图像放大,比双三次插值更精确,但计算时间更长。

import cv2
import numpy as np

img = cv2.imread("voice.PNG")
#其中fx fy表示比对输入图片的几倍。1 = 等于img.shape[]
res = cv2.resize(img,None,fx = 1, fy =1 ,interpolation=cv2.INTER_LINEAR)
print("res_x ==",res.shape[1],"res_y == ",res.shape[0])

#获得原图像的长款
height,width=img.shape[:2]
res=cv2.resize(img(2*width,2*height),interpolation=cv2.INTER_CUBIC)

cv2.imshow("res",res)
cv2.waitKey(0)

平移

在这里插入图片描述

在这里插入图片描述

import cv2
import numpy as np
img = cv2.imread("voice.PNG")
#平移操作
M = np.float32([[1, 0, 100], [0, 1, 50]])
dst = cv2.warpAffine(img,M,(img.shape[1],img.shape[0]))
cv2.imshow(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值