目录
1.opencv的安装
win+R打开命令提示符窗口,输入如下代码:
pip install opencv-python -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
pip install opencv-contrib-python -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
然后输入import cv2回车,再输入cv2.__version__后出现
表示安装成功。
打开ipycharm,导入cv2模块进行测试:
2.图像基础处理
2.1、直方图
基本原理:直方图,是一种二维统计图表,它的两个坐标分别是统计样本和该样本对应的某个属性的度量。图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。图像直方图图形化显示不同的像素值在不同的强度值上的出现频率,对于灰度图像来说强度范围为[0~255]之间,对于RGB的彩色图像可以独立显示三种颜色的图像直方图。同时直方图是用来寻找灰度图像二值化阈值常用而且是有效的手段之一,如果一幅灰度图像的直方图显示为两个波峰,则二值化阈值应该是这两个波峰之间的某个灰度值。并且直方图是调整图像对比度的重要依据,直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。
Matplotlib库
Matplotlib库主要的作用,是用来生成绘图,直方图,功率谱,条形图,错误图,散点图等,而Matplotlib是一个Python的2D绘图库,它以各种硬拷贝格式和跨平台的交互式环境生成出版质量级别的图形。
hist函数
hist有直方图的意思,直方图也被称为频数直方图,它用来显示数据集的分布情况。在MATLAB中绘制直方图的函数是hist,用法是hist(y,x),表示以向量x的各个元素为统计范围,绘制y的分布情况。
代码实现:
# -*- coding: cp936 -*-
from PIL import Image
from pylab import *
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
im = array(Image.open('E:/JiDaPictures/6.jpg').convert('L'))
subplot(131)
imshow(im)
subplot(132)
gray()
contour(im, origin='image')
axis('equal')
axis('off')
subplot(133)
hist(im.flatten(), 128)
print(im.flatten())
title(u'图像直方图')
plt.xlim([0,260])
plt.ylim([0,15000])
show()
2.2、高斯滤波
基本原理:高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
在图像处理中,高斯滤波一般有两种实现方式,一是用离散化窗口滑窗卷积,另一种通过傅里叶变换。最常见的就是第一种滑窗实现,只有当离散化的窗口非常大,用滑窗计算量非常大(即使用可分离滤波器的实现)的情况下,可能会考虑基于傅里叶变化的实现方法。
代码实现:
from PIL import Image
from pylab import *
from scipy.ndimage import filters
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
im = array(Image.open('E:/JiDaPictures/6.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()
2.3、直方图均衡化
基本原理:直方图均衡化又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果。通过把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布的技术。直方图均衡化能起到增强图像对比度的作用。
计算步骤
1.计算图像的灰度直方图
2.计算灰度直方图的累加直方图
3.根据累加直方图和直方图均衡化原理得到输入与输出之间的映射关系。
4.最后根据映射关系得到结果
代码实现:
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
from PCV.tools import imtools
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
im = array(Image.open('E:/JiDaPictures/4.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, density=True,stacked=True)
subplot(2, 2, 4)
axis('off')
title(u'均衡化后的直方图', fontproperties=font)
hist(im2.flatten(), 128, density=True,stacked=True)
show()