直方图是可以对整幅图的灰度分布进行整体了解的图示,通过直方图我们可以对图像的对比度、亮度和灰度分布等有一个直观了解。图像的直方图用来形象描绘该图像像素值的分布情况。我们用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间表示范围的像素数目。因此直方图不能显示图像中某像素所在的空间位置信息。同时也需要注意一点,不同的图像可能会有相同的直方图,所以不能用单独的直方图去恢复图像.
实现灰度图代码:
rom PIL import Image
import matplotlib.pyplot as plt
import numpy as np
# 将图像转成灰度图并读取到数组中
img = np.array(Image.open('1.jpg').convert('L'))
# 使用matplotlib的库绘制图片进行显示
# 使其标题可以显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure() # 新建一个图像
plt.subplot(1, 2, 1)
plt.imshow(img)
plt.title('原图')
plt.axis('off') # 不显示坐标轴
# 图像直方图
plt.subplot(1, 2, 2)
plt.hist(img.flatten(), 128)
plt.title('直方图')
plt.xlim([0, 300])
plt.ylim([0, 12000])
plt.show()
效果显示如下:
直方图均衡化可以用来改善图像的全局亮度和对比度。
直方图均衡化是指将一幅图像的灰度直方图变平,使变换后的图像中每个灰度值的分布概率都相同。在对图像做进一步处理之前,直方图均衡化通常是对图像灰度值进行归一化的一个非常好的方法,并且可以增强图像的对比度。
代码如下:
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
# 直方图均衡化
def histeq(img,nbr_bins=256):
"""
对一幅灰度图像进行直方图均衡化
:param img: 灰度图像
:param nbr_bins:直方图中使用小区间的数目
:return:直方图均衡化后的图像,以及用来做像素值映射的累积分布函数
"""
# 计算图像的直方图
imhist,bins = np.histogram(img.flatten(), nbr_bins, density=True)
# 累计分布函数
cdf = imhist.cumsum()
cdf = 255 * cdf / cdf[-1] # 归一化
# 使用累积分布函数的线性插值,计算新的像素值
img2 = np.interp(img.flatten(), bins[:-1], cdf)
return img2.reshape(img.shape),cdf
# 利用PIL库读取图像
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
# 将图像转成灰度图并读取到数组中
img = np.array(Image.open('1.jpg').convert('L'))
img2, cdf = histeq(img)
# 使用matplotlib的库绘制图片进行显示
# 使其标题可以显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure() # 新建一个图像
plt.subplot(2, 2, 1)
plt.imshow(img, cmap='gray')
plt.title('原图')
plt.axis('off') # 不显示坐标轴
plt.subplot(2, 2, 2)
plt.imshow(img2, cmap='gray')
plt.title('均衡化之后图像')
plt.axis('off')
plt.subplot(2, 2, 3)
plt.hist(img.flatten(), 128, density=True)
plt.title('原图直方图')
plt.axis('off')
plt.subplot(2, 2, 4)
img2 = np.array(img2)
plt.hist(img2.flatten(), 128, density=True)
plt.title('均衡化之后图像直方图')
plt.axis('off')
plt.show()
展示图像:
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。 可以简单的理解为,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
高斯滤波和高斯模糊:
高斯滤波也叫做高斯平滑和高斯滤波。为什么叫做高斯滤波呢?那是因为对图像进行滤波操作。那为什么要加上高斯呢,那是因为卷积核(掩膜)是由高斯分布计算出来的所以就需要加上高斯两字。其实滤波范围比模糊要大,滤波还有高通滤波、低通滤波等。为什么叫做高斯模糊呢,是因为通过这个操作可以让图片变得模糊。那为什么又叫高斯平滑呢,那是因为使图像更加平滑了(平滑是图片变得更加平缓,更加模糊,不那么尖锐)。
代码实现:
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
from scipy.ndimage import filters
# 将图像转成灰度图并读取到数组中
img_gray = np.array(Image.open('1.jpg').convert('L'))
im1 = filters.gaussian_filter(img_gray, 2)
im2 = filters.gaussian_filter(img_gray, 15)
# 模糊一幅彩色图像
img2 = np.array(Image.open('1.jpg'))
im3 = np.zeros(img2.shape)
im4 = np.zeros(img2.shape)
for i in range(3):
im3[:, :, i] = filters.gaussian_filter(img2[:, :, i], 5)
im4[:, :, i] = filters.gaussian_filter(img2[:, :, i], 15)
im3 = np.uint8(im3)
im4 = np.uint8(im4)
# 使用matplotlib的库绘制图片进行显示
# 使其标题可以显示中文
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
plt.figure() # 新建一个图像
plt.subplot(2, 3, 1)
plt.imshow(img_gray, cmap='gray')
plt.title('原灰度图像')
plt.axis('off')
plt.subplot(2, 3, 2)
plt.imshow(im1, cmap='gray')
plt.title('标准差 = 2')
plt.axis('off')
plt.subplot(2, 3, 3)
plt.imshow(im2, cmap='gray')
plt.title('标准差 = 15')
plt.axis('off')
plt.subplot(2, 3, 4)
plt.imshow(img2)
plt.title('原彩色图像')
plt.axis('off')
plt.subplot(2, 3, 5)
plt.imshow(im3)
plt.title('标准差 = 5')
plt.axis('off')
plt.subplot(2, 3, 6)
plt.imshow(im4)
plt.title('标准差 = 15')
plt.axis('off')
plt.show()
效果显示如下:
在本次实验中,我们使用python的图像操作库PIL,numpy等实现了直方图均衡化,高斯滤波等图像增强算法。
参考:python计算机视觉—图像处理基础:直方图、直方图均衡化、高斯滤波_RuijieRen的博客-CSDN博客