opencv视觉识别系统(计算机视觉系列)

文章目录

⛅️前言

⛅️阈值分割基础理论知识

⛅️阈值处理代码及实现讲解

⛅️图像平滑概念及具体知识

均值滤波

方框滤波

高斯滤波

中值滤波

卷积

⛅️前言

OpenCV提供的视觉处理算法非常丰富,并且它部分以C语言编写,加上其开源的特性,处理得当,不需要添加新的外部支持也可以完整的编译链接生成执行程序,所以很多人用它来做算法的移植,OpenCV的代码经过适当改写可以正常的运行在DSP系统和ARM嵌入式系统中,这种移植在大学中经常作为相关专业本科生毕业设计或者研究生课题的选题。

OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库得到更快的处理速度。

可应用领域包括: 1、人机互动 2、物体识别 3、图像分割 4、人脸识别 5、动作识别 6、运动跟踪 7、机器人 8、运动分析 9、机器视觉 10、结构分析 11、汽车安全驾驶等方面

opencv视觉识别系统(计算机视觉系列)(1)

⛅️阈值分割基础理论知识

阈值分割得六种形态图:

opencv视觉识别系统(计算机视觉系列)(2)

1.第一种为原始图像像素值分布图。2.二进制阈值化:假设我们设定阈值为189,如果大于189得像素值那么我们就把该像素值设置为最大值,也就是255。如果低于189得像素值,那么我们就设置该像素值为0。

3.反二进制阈值化:根据意思我们就可以知道和二进制阈值化相反,那么就说明如果我们设定阈值为189,那么大于189得像素值就是0,如果低于189得像素值,那么就设定像素值为255.

4.截断阈值化:假设我们设定阈值时127,那么如果像素值大于127,那么我们直接设定像素值为127,如果低于127,那么就保持像素值不变。

5.反阈值化为0:假如我们设定阈值为127,那么如果像素大于127,那么我们将新的像素值设定为0,如果低于127,那么我们将保留原始得像素值。

6.阈值化为0:假设我们依旧设定阈值为127,那么如果像素值高于127,那么我们保持不变,如果低于127,那么我们设定新的像素值为0.

opencv视觉识别系统(计算机视觉系列)(3)

⛅️阈值处理代码及实现讲解

阈值处理函数:函数threshold

retval, dst=cv2.threshold(src, thresh, maxval, type) 1

其中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() 1234567

以lena为例子,处理结果是:

opencv视觉识别系统(计算机视觉系列)(4)

可以看出来,将原来的灰度图像处理成了只有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() 1234567

这里只需要改动一个位置就可以,那么处理结果为:

opencv视觉识别系统(计算机视觉系列)(5)

就是和原来的二进制阈值化相反处理。截断阈值化:核心代码: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() 1234567

处理结果:

opencv视觉识别系统(计算机视觉系列)(6)

也就是说将图像的明亮部分都处理在阈值以下。反阈值化为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() 1234567

处理结果是:

opencv视觉识别系统(计算机视觉系列)(7)

将所有亮的地方都处理为黑色。也就是说高于阈值的地方都处理呈黑色。

阈值化为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() 1234567

opencv视觉识别系统(计算机视觉系列)(8)

将低于阈值部分都处理成黑色,其他不变。

⛅️图像平滑概念及具体知识均值滤波

✒️均值滤波:很明显我们通过白话来讲就是说肯定跟平均值有关,那么怎么和平均值相关的呢?

首先我们来看一下一个图像的区域像素值分布:

opencv视觉识别系统(计算机视觉系列)(9)

opencv视觉识别系统(计算机视觉系列)(10)

然后我们来看中间区域的红色部分为例子进行均值滤波处理计算:红色点的像素新值=蓝色背景区域像素值之和除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

opencv视觉识别系统(计算机视觉系列)(11)

针对原始图像内的像素点,逐个采用核进行处理,得到结果图像。也就是说每一个像素点都进行这个操作。那么有什么用呢?作用就是可以把尖锐的像素点的值给模糊掉然我们来看例子函数结果:处理结果=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() 1234567

专业一点来讲就是可以除噪:

opencv视觉识别系统(计算机视觉系列)(12)

方框滤波

⚽️方框滤波:主要是看函数的最后一个属性,如果设置为-1,那么方框滤波与均值滤波一样的效果,如果设置成1,那么就表示核函数内进行相加。具体请看下面讲解。

主要函数:boxFilter。 ⚽️运行结果=cv2. boxFilter(原始图像,目标图像深度,核大小,normalize属性),⚽️其中原始图像都理解,⚽️目标图像深度通常设置成-1,表示与原始图像相同,⚽️核函数请看下方图一,如果设置呈元组(5,5)就表示为下方左边图。⚽️normalize属性表示是否对图像进行归一化处理,如果进行归一化处理就设置成ture,不设置就为false。⚽️那么如果设置归一化处理的结果就是与均值滤波完全一致,如果不设置归一化处理,那么就表示核函数之间相加。看图二

opencv视觉识别系统(计算机视觉系列)(13)

opencv视觉识别系统(计算机视觉系列)(14)

⚽️方框滤波代码部分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() 1234567

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

对应结果分别是:

opencv视觉识别系统(计算机视觉系列)(15)

opencv视觉识别系统(计算机视觉系列)(16)

不进行归一化处理如果5×5的值相加很容易超过255,那么我们就都变成了255的像素值,也就都是白色了。那么如果我们设置核函数为2×2呢,让核函数小一点。那么对应的结果为:

opencv视觉识别系统(计算机视觉系列)(17)

这样滤波后的结果就不都是255了,就变成了有的地方的像素值是小于255的。但是像素值都比之前要高很多。

高斯滤波

高斯滤波:其实高斯滤波很简单,原理就是谁离我目标点越近,我就跟谁越好,给他的东西越多,对应官方的话就是给予权重越大。让临近的像素值有更高的重要度。

opencv视觉识别系统(计算机视觉系列)(18)

高斯滤波核心函数:GaussianBlur函数。

dst = cv2.GaussianBlur( src , ksize , sigmaX )

其中:src为原始图像ksize核函数的大小,这里需要注意,就是设置的核函数的大小必须为奇数大小sigmaX表示高斯滤波函数X方向的方差,这里表示成水平方向的规律就好了。用来控制权重。sigmaX=0时: sigma = 0.3((ksize-1)0.5 - 1) 0.8

高斯滤波对应代码:

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

opencv视觉识别系统(计算机视觉系列)(19)

这里可以看出,使用高斯滤波可以完成去噪的功能,但是他是缓和的去噪,根据他的原理我们就可以知道。

中值滤波

中值滤波:这里就很好理解了,比如我们取了核函数的大小,然后把核函数中的像素值进行排序,然后取中值替换到现在的值。

opencv视觉识别系统(计算机视觉系列)(20)

主要函数: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() 1234567

opencv视觉识别系统(计算机视觉系列)(21)

这里去噪最为完美因为很明显的就把很高的像素点都去掉了!!!

卷积

卷积:其实卷积也很简单的,之前我们介绍的均值滤波、中值滤波、方框滤波及高斯滤波都是基于图像本身做出操作,那么卷积就是我们设置了一个卷积核,用这个核去和我们图像的每一个像素值做乘法。

2D卷积核心函数:卷积核函数:kernel = np.ones((5,5),np.float32)/25设置的是5*5的卷积核。如图:

opencv视觉识别系统(计算机视觉系列)(22)

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

opencv视觉识别系统(计算机视觉系列)(23)

所以我们可以通过原理得到如果卷积核设置的越大,那么图像就会越模糊。

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

opencv视觉识别系统(计算机视觉系列)(24)

opencv视觉识别系统(计算机视觉系列)(25)

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页