计算机视觉-图像基础处理
[原发布时间: 2022-03-01 13:14:58]
目录
1. Opencv的安装
安装完python后可以使用python自带的pip命令安装opencv,命令如下:
pip install opencv-python
检查opencv模块是否安装成功:
C:\\Users\\lenovo>pythonPython 3.7.4 (default, Aug 9 2019, 18:34:13) [MSC v.1915 64 bit (AMD64)] :: Anaconda, Inc. on win32Warning:This Python interpreter is in a conda environment, but the environment hasnot been activated. Libraries may fail to load. To activate this environmentplease see https://conda.io/activationType \"help\", \"copyright\", \"credits\" or \"license\" for more information.>>> import cv2>>> cv2.__version__\'4.4.0\'
在python环境下依次输入import cv2
cv2.__version__
,出现版本号则说明opencv模块已安装成功
opencv模块的测试,编写如下代码后在python环境下运行:
import cv2img = cv2.imread(\"C:/Users/lenovo/Pictures/example/exper7.jpg\")cv2.imshow(\"test-opencv\",img)cv2.waitKey(0)
2. Pycharm中使用opencv出现的错误
安装好opencv后在Vscode和命令行终端中能正常运行使用到opencv模块的代码,但是在Pycharm中会出现ModuleNotFoundError: No module named \'cv2\'
的错误,原因是没有把opencv的路径添加到Pycharm的Python解释器中。因为cv2的核心模块在python中的\\lib\\site-packages
包中,因此需要把该路径添加到Pycharm的Python解释器中,具体步骤:
- 设置->Python 解释器
- 选择全部显示
- 点击树形图案
- 将
site-package
包的路径添加到解释器中
##3. 图像直方图
原理:图像的直方图用来表征该图像像素值的分布情况,用一定数目的小区间来指定像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。图形的直方图可以使用
hsit()
函数绘制。
源码:
from PIL import Imagefrom pylab import *# 添加中文字体支持from matplotlib.font_manager import FontPropertiesfont = FontProperties(fname=r\"c:\\windows\\fonts\\SimSun.ttc\", size=14)#读取图像,并转成灰度图像im = array(Image.open(\'C:/Users/lenovo/Pictures/example/exper7.jpg\').convert(\'L\')) subplot(131)imshow(im)axis(\'equal\')axis(\'off\')title(u\'灰度图\', fontproperties=font)subplot(132)gray()contour(im, origin=\'image\')# 表示x轴和y轴的单位长度相同axis(\'equal\')# 关闭所有坐标轴线、刻度标记和标签axis(\'off\')title(u\'图像轮廓\', fontproperties=font)subplot(133)hist(im.flatten(), 128)title(u\'图像直方图\', fontproperties=font)# 设置x轴和y轴的范围plt.xlim([0,260])plt.ylim([0,11000])show()
运行结果:
4. 高斯滤波
高斯滤波原理:将图像I和一个高斯和进行卷积操作:
I _ σ = I ∗ G _ σ I\\_\\sigma=I\\ast G\\_\\sigma I_σ=I∗G_σ
其中 ∗ \\ast ∗表示卷积操作, G σ G_\\sigma Gσ是标准差为 σ \\sigma σ的二维高斯核,定义为:
G σ = 1 2 π σ 2 e − ( x 2 + y 2 ) / 2 σ 2 G_\\sigma=\\frac{\\displaystyle1}{\\displaystyle 2 \\pi \\sigma^2}e^{-(x^2+y^2)/2\\sigma^2} Gσ=2πσ21e−(x2+y2)/2σ2
4.1 对灰度图像进行高斯滤波
源码:
from PIL import Imagefrom pylab import *from scipy.ndimage import filters# 添加中文字体支持from matplotlib.font_manager import FontPropertiesfont = FontProperties(fname=r\"c:\\windows\\fonts\\SimSun.ttc\", size=14)im = array(Image.open(\'C:/Users/lenovo/Pictures/example/exper7.jpg\').convert(\'L\'))figure()gray()axis(\'off\')subplot(1, 4, 1)axis(\'off\')title(u\'原图\', fontproperties=font)imshow(im)for bi, blur in enumerate([2, 5, 10]): im2 = zeros(im.shape) im2 = filters.gaussian_filter(im, blur) im2 = np.uint8(im2) imNum=str(blur) subplot(1, 4, 2 + bi) axis(\'off\') title(u\'标准差为\'+imNum, fontproperties=font) imshow(im2)show()
运行结果:
4.2 对彩色图像进行高斯滤波
源码:
from PIL import Imagefrom pylab import *from scipy.ndimage import filters# 添加中文字体支持from matplotlib.font_manager import FontPropertiesfont = FontProperties(fname=r\"c:\\windows\\fonts\\SimSun.ttc\", size=14)im = array(Image.open(\'C:/Users/lenovo/Pictures/example/exper7.jpg\'))figure()gray()axis(\'off\')subplot(1, 4, 1)axis(\'off\')title(u\'原图\', fontproperties=font)imshow(im)#如果是彩色图像,则分别对三个通道进行模糊for bi, blur in enumerate([2, 5, 10]): im2 = zeros(im.shape) for i in range(3): im2[:, :, i] = filters.gaussian_filter(im[:, :, i], blur) im2 = np.uint8(im2) imNum=str(blur) subplot(1, 4, 2 + bi) axis(\'off\') title(u\'标准差为\'+imNum, fontproperties=font) imshow(im2)show()
运行结果:
多张图片运行结果:
改变标准差的值:
由上述运行结果可知,使用相同的标准差对不同图像进行滤波时,滤波效果并不相同。
5. 直方图均衡化
原理:直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。均衡化过程中,像素无论怎么映射,都需要保证原来的大小关系不变,即较亮的区域依旧是较亮的,较暗的区域依旧较暗,只是对比度增大,明暗关系不发生变化。
源码:
from PIL import Imagefrom pylab import *from PCV.tools import imtools# 添加中文字体支持from matplotlib.font_manager import FontPropertiesfont = FontProperties(fname=r\"c:\\windows\\fonts\\SimSun.ttc\", size=14)im = array(Image.open(\'C:/Users/lenovo/Pictures/example/exper7.jpg\').convert(\'L\')) # 打开图像,并转成灰度图像im2, cdf = imtools.histeq(im)figure()subplot(2, 2, 1)axis(\'off\')gray()title(u\'原始图像\', fontproperties=font)imshow(im)subplot(2, 2, 2)axis(\'off\')title(u\'直方图均衡化后的图像\', fontproperties=font)imshow(im2)subplot(2, 2, 3)axis(\'off\')title(u\'原始直方图\', fontproperties=font)hist(im.flatten(), 128)subplot(2, 2, 4)axis(\'off\')title(u\'均衡化后的直方图\', fontproperties=font)hist(im2.flatten(), 128)show()
运行结果:
更换原始图像:
6. 总结
- 图像的直方图能够清晰直观地将图像分布在各个区间的像素数量展示出来
- 高斯滤波适用于消除高斯噪声,通过高斯滤波改变图像每一个像素点的值(用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值),且由于不同图像的像素分布情况不一,因此对多张图片使用相同的标准差进行滤波时效果不同
- “直方图均衡化”操作通过重新分配图像像素值,使一定灰度范围内的像素数量大致相同,从而起到增强图像对比度的效果