【python计算机视觉】图像的直方图,高斯滤波处理
直方图直方图基本原理什么是直方图呢 ?通过直方图我们可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值( 0 到 255), y 轴是图片中具有同一个灰度值的像素点的数目。关于直方图的重要函数解释cv2.calcHist () 可以帮助我们统计一幅图像的直方图。cv2.calcHist(images; channels; mask; histSize; ranges[; hist[
直方图
直方图基本原理
什么是直方图呢 ?通过直方图我们可以对整幅图像的灰度分布有一个整体的了解。直方图的 x 轴是灰度值( 0 到 255), y 轴是图片中具有同一个灰度值的像素点的数目。
关于直方图的重要函数解释
cv2.calcHist ()
可以帮助我们统计一幅图像的直方图。cv2.calcHist(images; channels; mask; histSize; ranges[; hist[; accumulate]])
- images: 原图像(图像格式为 uint8 或 float32)。当传入函数时应该用中括号 [] 括起来,例如: [img]。
- channels: 同样需要用中括号括起来,它会告诉函数我们要统计那幅图像的直方图。如果输入图像是灰度图,它的值就是 [0];如果是彩色图像的话,传入的参数可以是 [0], [1], [2] 它们分别对应着通道 B, G, R。
- mask: 掩模图像。要统计整幅图像的直方图就把它设为 None。但是如果你想统计图像某一部分的直方图的话,你就需要制作一个掩模图像,并使用它。
- histSize:BIN 的数目。也应该用中括号括起来,例如: [256]。
- ranges: 像素值范围,通常为 [0,256]。
以下图例子进行操作
代码实现
import cv2 as cv
from matplotlib import pyplot as plt
def plot_demo(image):
plt.hist(image.ravel(), 256, [0, 256]) # image.ravel()是将多维数组降为一维数组,256为bins数量,[0, 256]为范围
plt.show()
def hist_image(image):
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()
src = cv.imread("vision1/jmu.jpg")
cv.namedWindow("image", cv.WINDOW_NORMAL)
cv.imshow("image", src)
plot_demo(src)
hist_image(src)
cv.waitKey(0)
cv.destroyAllWindows()
运行结果
直方图均衡化
基本原理:
想象一下如果一副图像中的大多是像素点的像素值都集中在一个像素值范围之内会怎样呢?例如,如果一幅图片整体很亮,那所有的像素值应该都会很高。但是一副高质量的图像的像素值分布应该很广泛。所以应该把它的直方图做一个横向拉伸(如下图),这就是直方图均衡化要做的事情。通常情况下这种操作会改善图像的对比度。
代码实现
1.灰度图像均衡化
import cv2
import numpy as np
from PIL import Image
img = cv2.imread("vision1/jmu.jpg", 1)
i = Image.open("vision1/jmu.jpg").convert('L')
i.show()
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
dst = cv2.equalizeHist(gray)
cv2.namedWindow('dst', 0)
cv2.imshow("dst", dst)
cv2.waitKey(0)
运行结果:
2.彩色图像均衡化
彩色图像的直方图均衡化和灰度图像略有不同,需要将彩色图像先用split()方法,将三个通道拆分,然后分别进行均衡化.最后使用merge()方法将均衡化之后的三个通道进行合并.操作如下:
import cv2
import numpy as np
img = cv2.imread("vision1/jmu.jpg", 1)
# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
result = cv2.merge((bH, gH, rH))
cv2.namedWindow('demo', 0)
cv2.imshow("demo", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果:
高斯滤波
基本原理:
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。
首先,我们先要了解高斯滤波的原理,以及高斯滤波消除的高斯噪声是什么?
噪声,是图像中表现极为突兀的像素点或者像素块,会给图像带来干扰,让图像变得不清楚,或者说影响观察图像的细节。
而高斯噪声,就是噪声像素的概率密度函数服从高斯分布(正态分布)高斯噪声就是它的概率密度函数服从高斯分布(即正态分布)的一类噪声。如果一个噪声,它的幅度分布服从高斯分布,而它的功率谱密度又是均匀分布的,则称它为高斯白噪声。高斯白噪声的二阶矩不相关,一阶矩为常数,是指先后信号在时间上的相关性。
通俗地讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身核邻域内的其他像素值经过加权平均后得到。高斯滤波的具体操作是:用一个模板(或称卷积、掩膜)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
高斯函数
理论上,高斯分布在所有定义域上都有非负值,这就需要一个无限大的卷积核。实际上,仅需要取均值周围3倍标准差内的值,以外部份直接去掉即可。
高斯滤波的重要两步就是先找到高斯模板然后再进行卷积,模板(mask在查阅中有的地方也称作掩膜或者是高斯核)。所以这个时候需要知道它怎么来?又怎么用?
举个栗子:
假定中心点的坐标是(0,0),那么取距离它最近的8个点坐标,为了计算,需要设定σ的值。假定σ=1.5,则模糊半径为1的高斯模板就算如下
这个时候我们我们还要确保这九个点加起来为1(这个是高斯模板的特性),这9个点的权重总和等于0.4787147,因此上面9个值还要分别除以0.4787147,得到最终的高斯模板。
计算过程
假设现有9个像素点,灰度值(0-255)的高斯滤波计算如下:
将这9个值加起来,就是中心点的高斯滤波的值。
对所有点重复这个过程,就得到了高斯模糊后的图像。
高斯滤波步骤
综上可以总结一下步骤:
(1)移动相关核的中心元素,使它位于输入图像待处理像素的正上方
(2)将输入图像的像素值作为权重,乘以相关核
(3)将上面各步得到的结果相加做为输出简单来说就是根据高斯分布得到高斯模板然后做卷积相加的一个过程。
代码实现
import numpy as np
import imageio
def GaussianFilter(img):
h,w,c = img.shape
# 高斯滤波
K_size = 3
sigma = 1.3
# 零填充
pad = K_size//2
out = np.zeros((h + 2*pad,w + 2*pad,c),dtype=np.float)
out[pad:pad+h,pad:pad+w] = img.copy().astype(np.float)
# 定义滤波核
K = np.zeros((K_size,K_size),dtype=np.float)
for x in range(-pad,-pad+K_size):
for y in range(-pad,-pad+K_size):
K[y+pad,x+pad] = np.exp(-(x**2+y**2)/(2*(sigma**2)))
K /= (sigma*np.sqrt(2*np.pi))
K /= K.sum()
# 卷积的过程
tmp = out.copy()
for y in range(h):
for x in range(w):
for ci in range(c):
out[pad+y,pad+x,ci] = np.sum(K*tmp[y:y+K_size,x:x+K_size,ci])
out = out[pad:pad+h,pad:pad+w].astype(np.uint8)
return out
if __name__ == "__main__":
# 读取图像
img = imageio.imread("vision1/gousi.png")
# 高斯滤波
imageio.imsave("GaussianFilter.png",GaussianFilter(img))
运行结果:
原始图:
高斯滤波处理过后:

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。
更多推荐
所有评论(0)