计算机视觉
直方图、高斯滤波、直方图均衡化
原理:
直方图是数值数据分布的精确图形表示。 这是一个连续变量(定量变量)的概率分布的估计,并且被卡尔·皮尔逊(Karl Pearson)首先引入。它是一种条形图。
为了构建直方图,第一步是将值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。 这些值通常被指定为连续的,不重叠的变量间隔。 间隔必须相邻,并且通常是(但不是必须的)相等的大小。
作用:
1、显示质量波动的状态;
2、较直观地传递有关过程质量状况的信息;
3、当人们研究了质量数据波动状况之后,就能掌握过程的状况,从而确定在什么地方集中力量进行质量改进工作。
from numpy import array
from PIL import Image
#from matplotlib.pyplot import *
from pylab import *
#import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei'
plt.rcParams['axes.unicode_minus'] = False
im = array(Image.open('E:/Pythonproject/2021.png').convert('L')) # 打开图像,并转成灰度图像
print(im)
figure()
subplot(121)
gray()
contour(im, origin='image') # 画图
axis('equal') # 自动调整比例
axis('on') # 去除x、y轴上的刻度
title(u'原图轮廓')
subplot(122)
hist(im.flatten(), 128)
print(im.flatten())
title(u'直方图')
plt.xlim([0, 300])
plt.ylim([0, 11000])
show()
![在这里插入图片描述](https://img-blog.csdnimg.cn/160bcda039d2439d9ba29553aef7868b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5oCd5aaZ5oOz5aSa5aSa6LSiLeadsA==,size_14,color_FFFFFF,t_70,g_se,x_16#pic_center)
高斯滤波是一种线性平滑滤波器,对于服从正态分布的噪声有很好的抑制作用。在实际场景中,我们通常会假定图像包含的噪声为高斯白噪声,所以在许多实际应用的预处理部分,都会采用高斯滤波抑制噪声。
高斯滤波和均值滤波一样,都是利用一个掩膜和图像进行卷积求解。不同之处在于:均值滤波器的模板系数都是相同的,为1。而高斯滤波器的模板系数,随着距离模板中心距离的增大,系数减小(服从二维高斯分布)。所以,高斯滤波器相比于均值滤波器而言,对图像模糊程度较小,更能保持图像的整体细节。
import cv2
import matplotlib.pyplot as plt
from matplotlib.pyplot import title
import matplotlib
im = cv2.imread("E:/Pythonproject/2021.png")
# 高斯滤波
img_Guassian = cv2.GaussianBlur(im, (5, 5), 0)
plt.subplot(121)
plt.imshow(im)
# 设置字体为楷体
matplotlib.rcParams['font.sans-serif'] = ["KaiTi"]
title(u'原图')
plt.subplot(122)
plt.imshow(img_Guassian)
title(u'高斯滤波后')
plt.show()
直方图均衡化(Histogram Equalization) 又称直方图平坦化,实质上是对图像进行非线性拉伸,重新分配图像象元值,使一定灰度范围内象元值的数量大致相等。这样,原来直方图中间的峰顶部分对比度得到增强,而两侧的谷底部分对比度降低,输出图像的直方图是一个较平的分段直方图:如果输出数据分段值较小的话,会产生粗略分类的视觉效果。
直方图均衡化是将随机分布的图像直方图修改成均匀分布的直方图。基本思想是对原始图像的像素灰度做某种映射变换, 使变换后图像灰度的概率密度呈均匀分布。这就意味着图像灰度的动态范围得到了增加, 提高了图像的对比度。
from PIL import Image
from pylab import *
from PCV.tools import imtools
import matplotlib.pyplot as plt
import matplotlib
# 设置字体为楷体
matplotlib.rcParams['font.sans-serif'] = ["KaiTi"]
# 打开图像,并转成灰度图像
im = array(Image.open('E:/Pythonproject/2021.png').convert('L'))
im2, cdf = imtools.histeq(im)
figure()
subplot(2, 2, 1)
axis('off')
gray()
title(u'原始图像')
imshow(im)
subplot(2, 2, 2)
axis('off')
title(u'直方图均衡化')
imshow(im2)
subplot(2, 2, 3)
axis('off')
title(u'直方图')
hist(im.flatten(), 128, density=True)
subplot(2, 2, 4)
axis('off')
title(u'均衡化后的直方图')
hist(im2.flatten(), 128, density=True)
plt.show()