图像直方图为反映一幅图像中各灰度级与各灰度级像素出现的频率之间的关系图。
直方图的绘制是一个统计的过程,首先得到一张图片的灰度矩阵,接着将灰度值分为若干区间,统计每个灰度区间的像素数量,最后统计完图片中的所有像素即得到该图像的直方图。
hist函数的直方图绘制原理为将得到的一维数组进行统计,同样分为若干区间(bins),统计该数组中数值位于每个区间的个数,再在坐标系中进行可视化展示。其中的一维数组即为图像的灰度矩阵转化而来,彩色图像的灰度值可根据三个通道的色值在公式 R * 299/1000 + G * 587/1000+ B * 114/1000下转化获得。
例如:
我们处理如下3X3大小初始图像,我们首先将该图片表示为二维数组,接着扁平化处理为一维数组A(可用ravel()、flatten()等函数实现)
A={16,17,71,76,67,61,71,16,76}
接着将灰度区间 [0,255] 划分为若干子区间,统计每个子区间内的像素数量,再根据要求判断是否需要进行归一化处理,最终得到所需直方图
在该例中我们划分为128个子区间,每个区间包含两个灰度值,因此统计出位于区间[16,18)的像素个数为3,[60,62)像素个数为1,[66,68)像素个数为1,[70,72)像素个数为2,[76,78)像素个数为2,从而得出下图所示直方图。由于灰度值分布过于集中,因此可以进行归一化将[16,78]区间灰度变换为 [0,255],以增加图像的清晰度。
(1)调用PIL库(课本代码)
from PIL import Image
from pylab import *
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
im = array(Image.open('C:/Users/18042/Desktop/Vision/jmu.jpg').convert('L'))
figure(1)
subplot(121)
gray()
contour(im, origin='image')
axis('equal')
axis('off')
title(u'图像轮廓', fontproperties=font)
subplot(122)
hist(im.flatten(), 128)
title(u'图像直方图', fontproperties=font)
plt.xlim([0,260])
plt.ylim([0,25000])
show()
import cv2 as cv
from matplotlib import pyplot as plt
image = cv.imread('C:/Users/18042/Desktop/Vision/jmu.jpg', 0)
plt.hist(image.ravel(), 256, [0, 256])
plt.show()
cv.waitKey()
cv.destroyAllWindows()
(3)RGB三通道直方图
import cv2 as cv
from matplotlib import pyplot as plt
image = cv.imread('C:/Users/18042/Desktop/Vision/jmu.jpg', 1)
color = ("blue", "green", "red")
for i, color in enumerate(color):
hist = cv.calcHist([image], [i], None, [256], [0, 256])
plt.plot(hist, color=color)
plt.xlim([0, 256])
plt.show()
cv.waitKey()
cv.destroyAllWindows()
据百度百科:高斯滤波主要用于对图像的降噪,处理过程中图像每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
实现高斯滤波处理的关键点即为卷积,不同于其他滤波的是高斯滤波在赋予当前像素点与周围像素点权值时会根据距离中心点的距离做出改变(距离越近则权值越大),这样能够更好的保留原始像素的特征。
如下图所示我们对一张5X5大小(必须为奇数X奇数以保证唯一中心点)的图片进行高斯滤波处理,我们定义一个3X3大小的卷积核进行扫描。以初始图像的中心点为例,我们选取该点及其周围与卷积核大小对应的8个点,乘以对应的权值再求和,最终得到的“70”即为处理过后的结果。
import cv2 as cv
image = cv.imread('C:/Users/18042/Desktop/Vision/jmu.jpg',0)
blurred = cv.GaussianBlur(image,(9,9),0)
gaussImg = image - blurred
cv.imshow('gaussImg',gaussImg)
cv.waitKey()
cv.destroyAllWindows()
直方图均衡化是一种增强图像对比度的方法,其主要思想是将一副图像的直方图分布变换为近似均匀分布,从而达到增强图像对比度的目的。
equalizeHist()函数实现均衡化的原理主要为三个步骤
例:
i与Pi为根据已知图像得出的各灰度级分布概率,其均衡化计算过程如下图
import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
image = cv.imread('C:/Users/18042/Desktop/Vision/jmu.jpg', 0)
cv.imshow('inimg', image )
outimg = cv.equalizeHist(image)
cv.imshow('outimg', outimg )
plt.hist(image.ravel(), 128, [0, 256])
plt.show()
plt.hist(outimg.ravel(), 128, [0, 256])
plt.show()
cv.waitKey()
cv.destroyAllWindows()