python opencv 图像处理进阶篇(一)(python下载安装教程)

网友投稿 473 2022-08-27


python opencv 图像处理进阶篇(一)(python下载安装教程)

色彩空间变换与边缘、轮廓检测

在计算机视觉中有三种常用的色彩空间:

灰度色彩空间:除去彩色信息,将其图像转换成灰阶,常用于人脸检测BGR色彩空间:蓝-绿-红色彩空间,每个像素点由一个三元数组表示,数组中每个值代表一个颜色的HSV色彩空间:H(色调),S(饱和度),V(黑暗程度或明亮程度),常用于做图像颜色判定

1.傅里叶变换

这里引入一个概念:把图像中的像素看成是由不同频率的波(声波)组成,那整个图像就是由不同波叠加得到的。通过波的信号变化强度可以知道图像像素的变化强度(通过像素值乘以卷积核观察像素值变化),从而标记出哪些是噪声区域,哪些是感兴趣区域,分离图像数据。

傅里叶变换:简单说就是通过像素图像乘以卷积核,得到一个新的像素图像(把图像中最明亮的像素放到图像中央,然后以这个像素为中心扩散逐渐变暗,在边缘的像素最暗)

与深度学习中cnn算法有点相似,都是需要乘以一个卷积核来改变数据特征,不同的是,cnn是降维度提取特征值,而傅里叶变换保持图像的维度不变。

1.1高通滤波器

高通滤波器(HPF)检测某个区域的像素,根据目标区域像素与周围像素的亮度差来提升该区域像素的亮度。使用scipy进行图像转化调用方式如下:

scipy.ndimage.convolve1d(图像, 卷积核, axis=-1, output=None, mode=‘reflect’, cval=0.0, origin=0)cv.GaussianBlur(图像,卷积核,Size)

具体python实现如下,这里定义了二个不同卷积核:

import numpy as np import cv2 as cv from scipy import ndimage kernel_3x3=np.array([[-1,-1,-1], [-1,8,-1], [-1,-1,-1]]) kernel_5x5=np.array([[-1,-1,-1,-1,-1], [-1,1,2,1,-1], [-1,2,4,2,-1], [-1,1,2,1,-1], [-1,-1,-1,-1,-1]]) img=cv.imread('data.jpg',0) k3=ndimage.convolve(img,kernel_3x3) k5=ndimage.convolve(img, kernel_5x5) blurred=cv.GaussianBlur(img, (11,11), 0) g_hpf=img-blurred cv.imshow("3x3",k3) cv.imshow("5x5",k5) cv.imshow("g_hpf", g_hpf) cv.waitKey() cv.destroyAllWindows()

1.2低通滤波器

低通滤波器与高通滤波器原理相同,将像素与周围像素低亮度差值小于一个特定值时,平滑该像素的亮度,它主要作用用于去噪和模糊化.

2.边缘检测

边缘检测:简单说通过一张图像,识别出图像中的物体或姿态形状。

在opencv中有很多边缘检测的滤波函数:Laplacian()、Sobel()、Scharr(),这些函数方法是将非边缘区域的图像转化为黑色,将边缘区域图像转为白色或其他饱和色。存在问题:图像中若存在噪声,很容易错误的将噪声识别为边缘解决办法:在找到边缘之前,先对图像进行模糊处理,blur()、medianBlur()、GaussianBlur()。

注意边缘检测函数与模糊滤波函数都有一个参数Ksize,它表示滤波核对的宽和高

在这里使用Laplacian与medianBlur函数对小姐姐图像进行边缘检测处理,具体流程:

先对图像进行模糊啊化medianBlur(图像,Ksize)将图像转化为灰度图像进行边缘检测Laplacian,将其转化为黑色边缘和白色背景的图像像素数据值归一化,将像素值转化为0到1之间将得到的检测图像乘以源图像,得到源图像的边缘检测图

#设定模糊滤波核宽和高 blurKsize=7 #设定边缘滤波核宽和高 edgeKsize=5 img=cv.imread('data.jpg') blurredSrc=cv.medianBlur(img, ksize=blurKsize) graySrc=cv.cvtColor(blurredSrc, cv.COLOR_BGR2GRAY) cv.Laplacian(graySrc, cv.CV_8U,graySrc,ksize=edgeKsize) #归一化转黑白 normalizedInverseAlpha=(1.0/255)*(255-graySrc) #将边缘生成到源图像中 channels=cv.split(img) for channel in channels: channel[:]=channel*normalizedInverseAlpha cv.imshow("merge",cv.merge(channels))

3.轮廓检测

边缘检测与轮廓检测区别:

边缘检测:是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。 这些包括(i)深度上的不连续、(ii)表面方向不连续、(iii)物质属性变化和(iv)场景照明变化。轮廓检测:提取出想要得到的轮廓 轮廓可能是边缘的一部分

关键函数:

cv.threshold(源图像,输出图像,thresh,maxval,type)thresh:阈值maxval:源图像像素最大值type:阈值类型type逻辑如下:

threshold_type=CV_THRESH_BINARY:if src(x,y)>threshold: dst(x,y) = max_valueelse: dst(x,y) = 0threshold_type=CV_THRESH_BINARY_INV:if src(x,y)>threshold: dst(x,y) = 0else: dst(x,y) = max_valuethreshold_type=CV_THRESH_TRUNC:if src(x,y)>threshold: dst(x,y) = thresholdelse: dst(x,y) = src(x,y)threshold_type=CV_THRESH_TOZERO:if src(x,y)>threshold: dst(x,y) = src(x,y)else: dst(x,y) = 0threshold_type=CV_THRESH_TOZERO_INV:if src(x,y)>threshold: dst(x,y) = 0else: dst(x,y) = src(x,y)

cv.findContours(阈值输出图像,mode)mode:轮廓检索模式:cv2.RETR_EXTERNAL:表示只检测外轮廓cv2.RETR_LIST:检测的轮廓不建立等级关系cv2.RETR_CCOMP:建立两个等级的轮廓,上面的一层为外边界,里面的一层为内孔的边界信息。如果内孔内还有一个连通物体,这个物体的边界也在顶层。cv2.RETR_TREE:建立一个等级树结构的轮廓。

具体轮廓流程如下:

cv.threshold设置像素阈值,对图像像素进行分类cv.findContours检索出轮廓计算出一个简单的边界框计算出包围目标的最小矩阵区域

img=cv.pyrDown(cv.imread('data.jpg',cv.IMREAD_UNCHANGED))ret,thresh=cv.threshold(cv.cvtColor(img,cv.COLOR_BGR2GRAY),127,255,cv.THRESH_BINARY)contours,hier=cv.findContours(thresh, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)for c in contours: x,y,w,h=cv.boundingRect(c) cv.rectangle(img, (x,y), (x+w,y+h), (0,255,0),2) #找到最小区域 rect=cv.minAreaRect(c) #计算最小区域坐标 box=cv.boxPoints(rect) #坐标取整 box=np.int0(box) #画出轮廓框 cv.drawContours(img,[box],0,(0,0,255),3) cv.imshow("contours", img)


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:python opencv 图像处理(四)(python下载安装教程)
下一篇:python opencv图像处理(五)(python和java哪个更值得学)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~