本专栏主要介绍如果通过OpenCv-Python进行图像处理,通过原理理解OpenCv-Python的函数处理原型,在具体情况中,针对不同的图像进行不同等级的、不同方法的处理,以达到对图像进行去噪、锐化等一系列的操作。同时,希望观看本专栏的小伙伴可以理解到OpenCv进行图像处理的强大哦,如有转载,请注明出处(原文链接和作者署名),感谢各位小伙伴啦!
前文参考:
《OpenCv视觉之眼》Python图像处理一 :Opencv-python的简介及Python环境搭建
《OpenCv视觉之眼》Python图像处理二 :Opencv图像读取、显示、保存基本函数原型及使用
《OpenCv视觉之眼》Python图像处理三 :Opencv图像属性、ROI区域获取及通道处理
《OpenCv视觉之眼》Python图像处理四 :Opencv图像灰度处理的四种方法及原理
《OpenCv视觉之眼》Python图像处理五 :Opencv图像去噪处理之均值滤波、方框滤波、中值滤波和高斯滤波
《OpenCv视觉之眼》Python图像处理六 :Opencv图像傅里叶变换和傅里叶逆变换原理及实现
《OpenCv视觉之眼》Python图像处理七 :Opencv图像处理之高通滤波和低通滤波原理及构造
《OpenCv视觉之眼》Python图像处理八 :Opencv图像处理之图像阈值化处理原理及函数
《OpenCv视觉之眼》Python图像处理九 :Opencv图像形态学处理之图像腐蚀与膨胀原理及方法
《OpenCv视觉之眼》Python图像处理十 :Opencv图像形态学处理之开运算、闭运算和梯度运算原理及方法
《OpenCv视觉之眼》Python图像处理十一 :Opencv图像形态学处理之顶帽运算与黑帽运算
《OpenCv视觉之眼》Python图像处理十二 :Opencv图像轮廓提取之基于一阶导数的Roberts算法、Prewitt算法及Sobel算法
《OpenCv视觉之眼》Python图像处理十三 :Opencv图像轮廓提取之基于二阶导数的Laplacian算法和LOG算法
《OpenCv视觉之眼》Python图像处理十四 :Opencv图像轮廓提取之Scharr算法和Canny算法
《OpenCv视觉之眼》Python图像处理十五 :Opencv图像处理之图像缩放、旋转和平移原理及实现
《OpenCv视觉之眼》Python图像处理十六:Opencv项目实战之图像中的硬币检测
上次博客介绍了图像的轮廓提取,并且通过参数调节得到我们预期的图像最后绘制在原图上,是对OpenCV各种库函数的基本运用,也为后面更加深入层次的项目实战做准备,为基于OpenCV的人工智能识别做准备。上次博客需要掌握的便是对参数调节方式和思维模式。
本次博客,我们将在上次的基础上更新一点难度,除了将图像轮廓提取出来,并且需要将图像上的物体标注出来,同时截取出该物体,在后续的模型训练中,例如人脸识别的模型训练,在大多数时候我们只单单要人脸不需要人脸之外的其他东西,因此,我们需要将图像中的人脸截取出来然后进行模型训练,本次博客,便是为之后打下基础,一起学习吧!
图像处理实战二:之图像中的物体识别并截取(以图像中的蜜蜂为例)
对于图像中的物体识别的基本步骤和上次博客所讲解的基本步骤一致,包括数据准备、图像泛洪、灰度、高斯去噪、阈值化、形态学、边缘提取处理;唯一不同的是对边缘提取之后,是需要我们自己加一个框在轮廓上面,而不是直接将轮廓线条画在原图
1)、数据准备,以蜜蜂为例
2)、图像读取并泛洪处理
对于图像泛洪处理需要调节泛洪参数,如下的(3,3,3)和(4,4,4),根据图像泛洪的效果自己设定
#对图像进行泛洪处理
h, w = img1.shape[:2] #获取图像的长和宽
mask = np.zeros((h+2, w+2), np.uint8)#设置掩码,进行图像填充
cv2.floodFill(img1, mask, (w-1,h-1), (255,255,255), (3,3,3),(4,4,4),8) #对图像进行泛洪,去背景化
#图像灰度化
gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
设置为17x17的高斯核,是通过不断观察后续图像效果得到的结果,因此,对参数的设计,是需要结合完整代码对图像的处理效果而做调整。
#通过高斯滤波对图像进行模糊处理,可以理解为对图像硬币去噪
blur=cv2.cv2.GaussianBlur(gray,(17,17),0,0)#这里可以用中值滤波,具体视对图像效果选择
梯度图像中不大于177的任何像素都设置为0(黑色)。 否则,像素设置为255(白色)。
#通过二进制阈值化对图像进行阈值化处理,将蜜蜂轮廓与周围噪声区分开来
ret,thresh1=cv2.threshold(blur,177,255,cv2.THRESH_BINARY)
5)、图像形态学处理,去除图像内部噪声,如果图像内部无噪声,即图像阈值化后物体全黑,则可以省略该步骤
图像轮廓内部有噪声点一般通过闭运算进行处理,外部有噪声点一般通过开运算进行处理
#进行闭运算,去除图像内部噪声
kernel = np.ones((7,7), np.uint8)#设置卷积核
close=cv2.morphologyEx(thresh1, cv2.MORPH_CLOSE, kernel)#闭运算
6)、Canny算法进行图像轮廓提取,识别出图像中蜜蜂的轮廓线条
#利用canny算法对图像进行轮廓提取
Canny = cv2.Canny(close, 20, 150)
#在提取出的轮廓图像中找出轮廓线条,并在原图上面画出矩阵框
(cnts1,_) =cv2.findContours(Canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
c = sorted(cnts1, key=cv2.contourArea, reverse=True)[0]
# 计算最大轮廓的旋转边界框
rect = cv2.minAreaRect(c)
#box里保存的是绿色矩形区域四个顶点的坐标(从边界框中提取出顶点坐标)
box = np.int0(cv2.boxPoints(rect))
#将box的顶点坐标绘制在图中并连接线条
cv2.drawContours(img, [box], -1, (0, 255, 0), 3)
cv2.minAreaRect()函数:
主要求得包含点集最小面积的矩形,这个矩形是可以有偏转角度的,可以与图像的边界不平行,在文章后面步骤部分会讲解
7)、将图像中的矩形框中的图像进行裁剪,形成图像最大特征
#对图像进行裁剪,在顶点坐标中找到(x,y)的最大值和最小值做差得到轮廓图像的矩形区域
Xs = [i[0] for i in box]
Ys = [i[1] for i in box]
x1 = min(Xs)
x2 = max(Xs)
y1 = min(Ys)
y2 = max(Ys)
hight = y2 - y1
width = x2 - x1
newImg = img[y1:y1+hight, x1:x1+width]
box里保存的是绿色矩形区域四个顶点的坐标。按照图中四个顶点坐标位置裁剪昆虫图像。找出四个顶点的x,y坐标的最大最小值。
新图像的高=maxY-minY,宽=maxX-minX
1)、图像处理实战二完整代码
'''
OpenCV物体识别与裁剪
'''
#导入函数库
import cv2
import numpy as np
#读取图像
img=cv2.imread("bear.jpg")
#将原图进行复制,进行泛洪处理
img1=img.copy()
#对图像进行泛洪处理
h, w = img1.shape[:2] #获取图像的长和宽
mask = np.zeros((h+2, w+2), np.uint8)#设置掩码,进行图像填充
cv2.floodFill(img1, mask, (w-1,h-1), (255,255,255), (3,3,3),(4,4,4),8) #对图像进行泛洪,去背景化
#图像灰度化
gray=cv2.cvtColor(img1,cv2.COLOR_BGR2GRAY)
#通过高斯滤波对图像进行模糊处理,可以理解为对图像硬币去噪
blur=cv2.cv2.GaussianBlur(gray,(17,17),0,0)#这里可以用中值滤波,具体视对图像效果选择
#通过二进制阈值化对图像进行阈值化处理,将蜜蜂轮廓与周围噪声区分开来
ret,thresh1=cv2.threshold(blur,177,255,cv2.THRESH_BINARY)
#进行闭运算,去除图像内部噪声
kernel = np.ones((7,7), np.uint8)#设置卷积核
close=cv2.morphologyEx(thresh1, cv2.MORPH_CLOSE, kernel)#闭运算
#利用canny算法对图像进行轮廓提取
Canny = cv2.Canny(close, 20, 150)
#在提取出的轮廓图像中找出轮廓线条,并在原图上面画出矩阵框
(cnts1,_) =cv2.findContours(Canny,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
c = sorted(cnts1, key=cv2.contourArea, reverse=True)[0]
# 计算最大轮廓的旋转边界框
rect = cv2.minAreaRect(c)
#box里保存的是绿色矩形区域四个顶点的坐标(从边界框中提取出顶点坐标)
box = np.int0(cv2.boxPoints(rect))
#将box的顶点坐标绘制在图中并连接线条
cv2.drawContours(img, [box], -1, (0, 255, 0), 3)
cv2.imshow("recognition",img)
#对图像进行裁剪,在顶点坐标中找到(x,y)的最大值和最小值做差得到轮廓图像的矩形区域
Xs = [i[0] for i in box]
Ys = [i[1] for i in box]
x1 = min(Xs)
x2 = max(Xs)
y1 = min(Ys)
y2 = max(Ys)
hight = y2 - y1
width = x2 - x1
newImg = img[y1:y1+hight, x1:x1+width]
cv2.imshow("Tailoring",newImg)
cv2.waitKey(0)
1)、图像泛洪函数原型:cv2.floodFill(img,mask,seed,newvalue(BGR),(a,b,c),(a1,b1,c1),flag)
2)、sorted()函数为python内置函数,功能是该函数对所有可迭代的对象进行排序操作,原型如下:
sorted(iterable, key=None, reverse=False)
3)、计算轮廓面积cv2.contourArea()原型:cv2.contourArea(cnt, True)
注意:以上函数作为sorted()函数中的key传递进去了哦!
4)、旋转边界cv2.minAreaRect()原型:result=cv2.minAreaRect(Points)
提示:minAreaRect就是求出在上述点集下的最小面积矩形
以上就是本次博客的全部内容,遇到问题的小伙伴记得留言评论,学长看到会为大家进行解答的,这个学长不太冷!
懂得感恩的人,往往是有谦虚之德的人,是有敬畏之心的人。对待比自己弱小的人,知道要躬身弯腰,便是属于前者;感受上苍懂得要抬头仰视,便是属于后者。
陈一月的又一天编程岁月^ _ ^