大家好,162100网站源码分享使用相信很多的网友都不是很明白,包括网站源码官网也是一样,不过没有关系,接下来就来为大家分享关于162100网站源码分享使用和网站源码官网的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
导读:OpenCV是一个以BSD许可证开源的、跨平台的计算机视觉库。它提供了Python、C++、Java、Matlab等多种编程语言接口。它集成了很多计算机视觉算法,具有非常强大的功能,是计算机视觉中最为著名的一个库。在本文中,我们将要介绍OpenCV的一些基本用法。
作者:王天庆
如需转载请联系华章科技
01OpenCV介绍
OpenCV是使用C++进行编写的、以BSD许可证开放源代码的、跨平台的计算机视觉库。它提供了上百种计算机视觉、机器学习、图像处理等相关算法,新版本的OpenCV支持Tensorflow、Caffe等深度学习框架。
OpenCV的底层优化处理得很好,能够支持多核处理,能够利用硬件实现加速。由于该库是以BSD许可证进行开源的,因此可以被免费应用在科学研究与商业应用中。
OpenCV库是由英特尔公司下属的俄罗斯技术团队发起的,由于优异的性能、免费、开源、算法丰富、使用简单等优点,自从项目被发起后便得到迅猛发展,越来越多的组织和个人加入到源代码的贡献队伍中,这也在客观进一步促进了OpenCV库的发展。
OpenCV在诸多领域得到了广泛的应用,例如物体检测、图像识别、运动跟踪、增强现实(AR)、机器人等场景。我们在本书中需要对图像进行处理时,需要用到OpenCV库。
OpenCV的安装也比较简单,在Python中,通过pip包管理工具就可以实现安装:
pipinstallopencv-python\n
如果在anaconda环境中安装OpenCV,则通过下面的方法进行安装:
condainstallopencv\n
安装完毕OpenCV后,可以通过下述方法来查看是否安装成功:
查看安装的版本\ncv2.__version__\n使用imread()方法读入一个图片\nimage=cv2.imread(“lena.jpg”)\n返回:(121,121,3)\n将存储图片数据的image变量写到磁盘中,写出的文件名为lena.bak.jpg\n(121,121,3)\n(121,121)\n(121,121,3)\n输出将灰度图片重新转换为BGR形式图片后的内容\nprint(img2)\n”’\n[[[170170170]\n[171171171]\n[170170170]\n…,\n[111111111]\n[169169169]\n[193193193]]\n[[167167167]\n[167167167]\n[166166166]\n…,\n[127127127]\n[120120120]\n[102102102]]\n[[165165165]\n[163163163]\n[162162162]\n…,\n[939393]\n[333333]\n[141414]]\n…,\n[[393939]\n[383838]\n[434343]\n…,\n[393939]\n[303030]\n[333333]]\n[[333333]\n[323232]\n[313131]\n…,\n[343434]\n[515151]\n[666666]]\n[[292929]\n[313131]\n[303030]\n…,\n[343434]\n[717171]\n[989898]]]\n”’\n
在上面的例子中,我们看到使用cvtColor()函数可以将彩色图片转换为灰度图片,经过转换后的图片shape属性减少了一个维度,所以这个过程也可以看作是一个降维的过程。
在cvtColor()函数取convertcolor之意,第二个参数表示的是转换操作的类别。这里我们是将BGR形式的图片转换为灰度图片,所以使用cv2.COLOR_BGR2GRAY常量来表示,当然如果将灰度图片转换为BGR形式的图片,也可以传入cv2.COLOR_GRAY2BGR常量。
在代码清单②中做了一个实验:尝试将灰度图片gray_img再次转换为BGR形式的彩色图片,发现转换后的图片无法恢复原先不同颜色通道的数值,OpenCV所采用的方法是将所有的颜色通道全都置成相同的数值,这个数值就是该点的灰度值。
这也说明了从彩色图片转换到灰度图片的计算是单向的,使用简单的算法将灰度图片恢复为彩色图片是很难的,OpenCV中所采用的转换过程只是形式上的转换,并不是真正将灰度图片转换为彩色形式。目前有效果比较好的将灰度图片转换为彩色图片的算法多是结合机器学习的方法来实现的。
2.负片转换
负片是摄影中会经常接触到的一个词语,在最早的胶卷照片冲印中是指经曝光和显影加工后得到的影像。负片操作在很多图像处理软件中也叫反色,其明暗与原图像相反,其色彩则为原图像的补色。
例如颜色值A与颜色值B互为补色,则其数值的和为255。即RGB图像中的某点颜色为(0,0,255)则其补色为(255,255,0)。
由于负片的操作过程比较简单,OpenCV并没有单独封装负片函数,这里我们需要将一张图片拆分为各个颜色通道矩阵,然后分别对每一个颜色通道矩阵进行处理,最后再将其重新组合为一张图片,示例代码如下。
代码清单③负片功能实现
importnumpyasnp\nimportcv2\n获取高度和宽度,注意索引是高度在前,宽度在后\nheight=img.shape[0]\nwidth=img.shape[1]\n将BGR形式存储的彩色图片拆分成三个颜色通道,注意颜色通道的顺序是蓝、绿、红\nb,g,r=cv2.split(img)\n将处理后的结果赋值到前面生成的三维张量中\nnegative_file[:,:,0]=b\nnegative_file[:,:,1]=g\nnegative_file[:,:,2]=r\n将生成的图片保存起来,注意存储图片文件名中的扩展名\ncv2.imwrite(“negative_lena.jpg”,negative_file)\n
经过上述代码的对图像的处理,我们可以看到经过处理的图像如图4-4b所示,原始图像如图4-4a所示。
▲图4-4原始图像与经过负片处理后的图像
使用负片对图像进行处理,就是将图片的颜色进行反转的过程,这是一个线性变换过程。在图像处理中可以增强暗色区域中的白色或灰色细节。在这个例子中,我们应该同时熟悉对彩色图片中三个不同颜色通道的拆分以及重新构建图像的方法。
3.亮度与对比度转换
一般来说,图像处理算子是将一幅或多幅图像作为输入数据,产生一幅输出图像的函数。图像变换可分为以下两种。
点算子:基于像素变换,在这一类图像变换中,仅仅根据输入像素值(有时可加上某些额外信息)计算相应的输出像素值。邻域算子:基于图像区域进行变换。
两种常用的点算子,是用常数对点的像素值进行乘法或加法运算,可以表示为:
g(i,j)=α·f(i,j)+β
其中,图像中点的位置为(i,j),α值代表增益,β值代表偏置。对图像进行亮度和对比度的变换就是一种点算子,这两个参数分别可以用来控制对比度与亮度。
熟悉这个原理之后,我们就可以通过调节这两个参数的值,来对图片进行对比度或亮度的调节。即将原图像中的每一个像素点都加上一个偏置常数,则可以使图片的亮度变大,类似地,可以将原图片中的像素点乘上一个增益系数,来调整图片的对比度。
但是要注意,图片像素点的像素值取值范围是[0,255],一定不应该让其溢出,否则图片将不是我们想要的效果。
代码清单④分别演示了实现对图片的像素点进行计算的两种方法。
代码清单④对图片亮度与对比度转换演示
importcv2\nimportnumpyasnp\ndtpyeisuint8\nreturncv2.addWeighted(img,alpha,blank,0,beta)\nnp.clip()将数值限制在[0,255]区间,防止数字溢出\nnew_img[i,j,k]=np.clip(\nalpha*img[i,j,k]+beta,0,255)\nreturnnew_img\nimg=cv2.imread(‘lena.jpg’)\ncv2.imwrite(‘converted_lena_1.jpg’,convert_img1(img,2.2,50))\ncv2.imwrite(‘converted_lena_2.jpg’,convert_img2(img,2.2,50))\n
在上述代码中,convert_img1()函数的addWeighted()函数的参数列表分别为:
[img1,alpha,img2,beta,gamma]
代表将两个图片进行如下计算:
new_img=alpha·img1+beta·img2+gamma
因此,函数convert_img2()实现的过程,就是通过for循环修改原始图片的像素值,与convert_img1()函数的过程是一样的,只不过convert_img1()函数调用addWeighted()函数的img2参数中图片的像素值都是0罢了。
可以得到变换前的图片如图4-5a所示,变换后的图片如图4-5b所示。
▲图4-5图片亮度与对比度转换示例
04几何变换
图像的几何变换是指对图像中的图像像素点的位置进行变换的一种操作,它将一幅图像中的坐标位置映射到新的坐标位置,也就是是改变像素点的空间位置,同时也要估算新空间位置上的像素值。
经过几何变换的图片,直观来看就是其图像的形态发生了变化,例如常见的图像缩放、平移、旋转等都属于几何变换。
1.图像裁剪
图像的裁剪实现起来相对容易,即在图像数据的矩阵中裁剪出部分矩阵作为新的图像数据,从而实现对图像的裁剪。例如下面的代码段落实现了对图片的裁剪。
代码清单⑤图像裁剪演示
importcv2\nimportnumpyasnp\nimg=cv2.imread(‘lena.jpg’)\nprint(img.shape)\n(121,121,3)\nnew_img=cv2.resize(img,(40,40),interpolation=cv2.INTER_AREA)\ncv2.imwrite(‘new_img1.jpg’,new_img)\nprint(new_img.shape)\n注意图像的宽对应的是列数,高对应的是行数\n第一个参数为旋转中心,第二个为旋转角度,第三个为旋转后的缩放因子\nrotated_img=cv2.getRotationMatrix2D((cols/2,rows/2),45,0.4)\ncv2.imwrite(‘dst.jpg’,dst)\n
原图如图4-7a所示,经过旋转后的图像如图4-8所示。
▲图4-8经过旋转后的图像
05图像噪声处理
我们曾在前面介绍过噪声,与信号相比,噪声是我们不希望得到的,噪声量越少则表明图像质量越高。由于图像采集设备的性能不同,有的采集设备获得的噪声少,有的则会很多,这可能会干扰到图像的处理。
因此,我们在这里介绍一下噪声的消减方法,可以用在图像的预处理上。与此同时,对训练数据添加适量噪声,可以使训练后的模型更加鲁棒,对模型的性能提升有一定帮助。因此,为图像添加噪声可以起到数据增强的作用。
1.添加噪声
下面我们演示一下对图像添加两种常用噪声的方法,一种是椒盐噪声,另一种是高斯噪声,它们的实现代码如代码清单⑧所示。
代码清单⑧为图像添加噪声
importcv2\nimportnumpyasnp\nimportrandom\n黑色噪点\nelse:\nimg[x,y]=255添加高斯随机噪声\ndefgaussian_noise(img,mu,sigma,k):\nrows,cols=img.shape\nforiinrange(rows):\nforjinrange(cols):\n限定数据值的上下边界\nvalue=np.clip(a_max=255,a_min=0,a=value)\nimg[i,j]=value\nreturnimg\nimg=cv2.imread(‘lena.jpg’)\n需要复制一份,不然是对图像的引用,后面的操作会重叠\ngray_img2=gray_img.copy()\n保存高斯噪声图像\ncv2.imwrite(‘gaussian.jpg’,\ngaussian_noise(gray_img2,0,1,32))\n
▲图4-9为图像添加噪声示例
在图4-9中,图4-9b是椒盐噪声处理后的图像,图4-9b是高斯噪声处理后的图像。
2.模糊与滤波
OpenCV为我们提供了几种滤波方法,诸如中值滤波、双边滤波、高斯模糊、二维卷积等,这些操作的基本方法如代码清单⑨所示。
代码清单⑨图像滤波演示
importcv2\nimportnumpyasnp\nimportrandom\nsalt_and_pepper_img=cv2.imread(‘salt_and_pepper.jpg’)\ngaussian_img=cv2.imread(‘gaussian.jpg’)\n得到一个5*5大小的矩阵作为卷积核,矩阵中的每个值都为0.04\nkernel=np.ones((5,5),np.float32)/25\nconv_2d_img=cv2.filter2D(salt_and_pepper_img,-1,kernel)\ncv2.imwrite(‘filter_2d_img.jpg’,conv_2d_img)\n参数5表示选择附近5*5区域的像素值进行计算\nmedian_blur_img=cv2.medianBlur(salt_and_pepper_img,5)\ncv2.imwrite(‘median_blur_img.jpg’,median_blur_img)\n标准差参数设置为0是指根据窗口大小(5,5)来自行计算高斯函数标准差\ngaussian_blur_img=cv2.GaussianBlur(gaussian_img,(5,5),0)\ncv2.imwrite(‘gaussian_blur_img.jpg’,gaussian_blur_img)\ncv2.bilateralFilter(src,d,sigmaColor,sigmaSpace)\n#9代表邻域直径,两个参数75分别代表值域与空域标准差\nbilateral_filter_img=cv2.bilateralFilter(gaussian_img,9,75,75)\ncv2.imwrite(‘bilateral_filter_img.jpg’,bilateral_filter_img)\n
上述操作加入过噪声的原始图像如图4-9所示,这两个带有噪声的图像经过滤波处理的结果如图4-10所示。
a)对添加过椒盐噪声图片经过二维卷积滤波后的结果
b)对添加过椒盐噪声图片进行中值滤波后的结果
c)对经过高斯噪声污染后的图片进行高斯滤波后的结果
d)对经过高斯噪声污染后的图片进行双边滤波后的结果
▲图4-10带有噪声的图像经过滤波处理后的结果
06小结
OpenCV是一个非常优秀且使用广泛的开源计算机视觉库,该库核心代码采用C++编写,提供了多种语言接口。在本文中,我们学习了OpenCV的Python接口使用方法,学习使用OpenCV对图像进行操作的基本方法。
关于作者:王天庆,长期从事分布式系统、数据科学与工程、人工智能等方面的研究与开发,在人脸识别方面有丰富的实践经验。现就职某世界100强企业的数据实验室,从事数据科学相关技术领域的预研工作。
本文摘编自《Python人脸识别:从入门到工程实践》,经出版方授权发布。
延伸阅读《Python人脸识别》
推荐语:华为资深AI工程师撰写,全面讲解人脸识别各项基础技术、原理和算法,从零实现工程级人脸识别引擎。
END,本文到此结束,如果可以帮助到大家,还望关注本站哦!
