文章目录
⛅️前言
🎆OpenCV提供的视觉处理算法非常丰富,并且它部分以C语言编写,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整的编译链接生成执行程序,所以很多人用它来做算法的移植,OpenCV的代码经过适当改写可以正常的运行在DSP系统和ARM嵌入式系统中,这种移植在大学中经常作为相关专业本科生毕业设计或者研究生课题的选题。 |
🎆OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库得到更快的处理速度。 |
🎆可应用领域包括: 1、人机互动 2、物体识别 3、图像分割 4、人脸识别 5、动作识别 6、运动跟踪 7、机器人 8、运动分析 9、机器视觉 10、结构分析 11、汽车安全驾驶等方面 |
⛅️阈值分割基础理论知识
阈值分割得六种形态图:
⛅️阈值处理代码及实现讲解
阈值处理函数:
🔮函数threshold
retval, dst=cv2.threshold(src, thresh, maxval, type)
其中src表示原图像,thresh表示阈值,maxval表示最大值,type表示类型。函数对应返回两个值,分别是阈值和处理结果。 |
🔮二进制阈值化代码:
核心代码:cv2.THRESH_BINARY
import cv2
a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
以lena为例子,处理结果是:
可以看出来,将原来的灰度图像处理成了只有0和最大值255的图像,可以说处理成了二值图像。
🔮反二进制阈值化代码:
核心代码:cv2.THRESH_BINARY_INV
import cv2
a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_BINARY_INV)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
这里只需要改动一个位置就可以,那么处理结果为:
就是和原来的二进制阈值化相反处理。
🔮截断阈值化:
核心代码:cv2.THRESH_TRUNC
import cv2
a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_TRUNC)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
处理结果:
也就是说将图像的明亮部分都处理在阈值以下。
🔮反阈值化为0代码:
核心代码:cv2.THRESH_TOZERO_INV
port cv2
a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_TOZERO_INV)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
处理结果是:
将所有亮的地方都处理为黑色。也就是说高于阈值的地方都处理呈黑色。
🔮阈值化为0代码:
核心代码:cv2.THRESH_TOZERO
import cv2
a=cv2.imread("image\\lena512.bmp",cv2.IMREAD_UNCHANGED)
r,b=cv2.threshold(a,127,255,cv2.THRESH_TOZERO)
cv2.imshow("a",a)
cv2.imshow("b",b)
cv2.waitKey()
cv2.destroyAllWindows()
将低于阈值部分都处理成黑色,其他不变。
⛅️图像平滑概念及具体知识
🎍均值滤波
✒️均值滤波:很明显我们通过白话来讲就是说肯定跟平均值有关,那么怎么和平均值相关的呢? |
首先我们来看一下一个图像的区域像素值分布:
然后我们来看中间区域的红色部分为例子进行均值滤波处理计算:
红色点的像素新值=蓝色背景区域像素值之和除25
红色点的像素新值=
((197+25+106+156+159)+(149+40+107+5+71)+
(163+198+226+223+156)+(222+37+68+193+157)+
(42+72+250+41+75))/25
针对原始图像内的像素点,逐个采用核进行处理,得到结果图像。也就是说每一个像素点都进行这个操作。那么有什么用呢?作用就是可以把尖锐的像素点的值给模糊掉然我们来看例子
函数结果:处理结果=cv2.blur(原始图像,核大小)
核大小:以(宽度,高度)形式表示的元组
import cv2
o=cv2.imread("image\\lenaNoise.png")
r=cv2.blur(o,(5,5))
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
专业一点来讲就是可以除噪:
🎍方框滤波
⚽️方框滤波:主要是看函数的最后一个属性,如果设置为-1,那么方框滤波与均值滤波一样的效果,如果设置成1,那么就表示核函数内进行相加。具体请看下面讲解。 |
主要函数:boxFilter。 ⚽️运行结果=cv2. boxFilter(原始图像,目标图像深度,核大小,normalize属性),⚽️其中原始图像都理解,⚽️目标图像深度通常设置成-1,表示与原始图像相同,⚽️核函数请看下方图一,如果设置呈元组(5,5)就表示为下方左边图。⚽️normalize属性表示是否对图像进行归一化处理,如果进行归一化处理就设置成ture,不设置就为false。⚽️那么如果设置归一化处理的结果就是与均值滤波完全一致,如果不设置归一化处理,那么就表示核函数之间相加。看图二 |
⚽️方框滤波代码部分
normalize=1就表示进行归一化处理,和不设置一样,也就是说默认就是进行归一化处理。如果设置为0,就表示不进行归一化处理。代码分别是:
import cv2
o=cv2.imread("image\\lenaNoise.png")
r=cv2.boxFilter(o,-1,(5,5),normalize=1)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
import cv2
o=cv2.imread("image\\lenaNoise.png")
r=cv2.boxFilter(o,-1,(5,5),normalize=0)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
对应结果分别是:
不进行归一化处理如果5×5的值相加很容易超过255,那么我们就都变成了255的像素值,也就都是白色了。
那么如果我们设置核函数为2×2呢,让核函数小一点。那么对应的结果为:
这样滤波后的结果就不都是255了,就变成了有的地方的像素值是小于255的。但是像素值都比之前要高很多。
🎍高斯滤波
🎴高斯滤波:其实高斯滤波很简单,原理就是谁离我目标点越近,我就跟谁越好,给他的东西越多,对应官方的话就是给予权重越大。让临近的像素值有更高的重要度。 |
🎴高斯滤波核心函数:GaussianBlur函数。 |
🎴dst = cv2.GaussianBlur( src , ksize , sigmaX ) |
🎴高斯滤波对应代码:
import cv2
o=cv2.imread("image\\lenaNoise.png")
r=cv2.GaussianBlur(o,(3,3),0)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
这里可以看出,使用高斯滤波可以完成去噪的功能,但是他是缓和的去噪,根据他的原理我们就可以知道。
🎍中值滤波
👑中值滤波:这里就很好理解了,比如我们取了核函数的大小,然后把核函数中的像素值进行排序,然后取中值替换到现在的值。 |
👑主要函数:medianBlur函数 |
👑dst = cv2.medianBlur( src , ksize ) |
其中src表示原始图像,ksize表示核函数的大小。同样这里的核函数的大小必须是奇数。且不是原则,直接写数字就可以,比如3就表示3*3
👑中值滤波代码部分
import cv2
o=cv2.imread("image\\lenaNoise.png")
r=cv2.medianBlur(o,3)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
这里去噪最为完美因为很明显的就把很高的像素点都去掉了!!!
🎍卷积
🍼卷积:其实卷积也很简单的,之前我们介绍的均值滤波、中值滤波、方框滤波及高斯滤波都是基于图像本身做出操作,那么卷积就是我们设置了一个卷积核,用这个核去和我们图像的每一个像素值做乘法。 |
🍼2D卷积核心函数:
卷积核函数:kernel = np.ones((5,5),np.float32)/25
设置的是5*5的卷积核。如图:
🍼2D卷积核心函数:r=cv2.filter2D( o , -1 ,f )
-1表示图像深度和原图像一致,最后一个f表示卷积核的意思。
🍼代码部分:
import cv2
import numpy as np
o=cv2.imread("image\lenacolor.png")
f=np.ones((5,5),np.float32)/25
r=cv2.filter2D(o,-1,f)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
所以我们可以通过原理得到如果卷积核设置的越大,那么图像就会越模糊。
import cv2
import numpy as np
o=cv2.imread("image\lenacolor.png")
f=np.ones((10,10),np.float32)/100
r=cv2.filter2D(o,-1,f)
cv2.imshow("original",o)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()