空域变换-直方图均衡化(直方图修正)

目录

1. 介绍

2. 直方图均衡化(直方图修正)

3. 代码实现


1. 介绍

空域指的是像素组成的空间,空间域是图像平面本身。

空间域的图像处理方法是直接对图像中的像素进行处理。后面介绍的变换域,是指将空间域的图像转换到别的域中,例如频率域,在变换域中进行处理,再将结果反变换到空间域

空域变换的图像处理可以分为两个类别:灰度变换、空间滤波

其实图像变换都是基于像素的映射,区别是像素是怎么映射的。灰度变换的话是通过点对点的映射,也就是变换后的像素点之和当前的像素点有关(gramma变换、对数变换等等),依次来进行对比度拉伸。而空间滤波变换后的像素点是和当前像素点以及当前像素点周围的点有关,也就是对图像每个像素点的领域进行映射

本章介绍的直方图处理是针对于全局的像素点,将任意图像的像素点的分布变换为均匀分布的形式,来增强灰度动态范围偏小的反差以此增强图像的对比度

直方图处理是一种统计表示,反映了像素灰度值的分布情况,即图像像素点灰度取值的分布情况

例如:

图像像素点的分布是[[1,2],[1,3]],那么灰度值为1的个数就有两个,灰度值为2,3的个数都为2,这种就是图像的直方图表示。如果将灰度值的个数除以所以像素点的个数的话(0.5,0.25,0.25)这种就是归一化直方图

接下来介绍一下累计直方图,它描述的是图像像素点的灰度值 <= k 的像素点数量。如果将结果除以总像素点的个数的话,就成为归一化累计直方图,它描述的是图像像素点的灰度值 <= k 的像素点占总像素点的概率。

2. 直方图均衡化(直方图修正)

直方图均衡化我们先假设两个性质

  • 变换函数是一个单调增函数。保证图像灰度的排列次序不变,也就是说原来灰度值低的像素点变换后灰度值依然低
  • 如果变换前灰度的动态范围是[0,255],那么变换后也是[0,255]。保证变换前后灰度的动态范围前后一致

这里不作具体的数学描述,我们通过一个直方图修正的例子来讲解

空域变换-直方图均衡化(直方图修正)_第1张图片

我们假设图像的灰度值是一 3bit,灰度级为8的图像,直方图均衡化的过程如下:

  1. 首先计算对应灰度值的像素点个数
  2. 计算归一化直方图,也就是拿灰度级像素点的个数除以总的像素个数
  3. 计算归一化累计直方图。s = 0 的时候是0.19 ,s =1的时候是0.19 +0.25,s = 2的时候是0.19+0.25+0.21以此类推...
  4. 进行直方图均衡化,将归一化的直方图乘上图像总的灰度级。0.19 * 7 = 1.33 , 0.44*7=3.08等等,然后进行四舍五入到整数的灰度级当中,所以这里s = 0->1,s=1->3
  5. 最后进行映射可以了,也就是将原来图像灰度值为0的更改为1,灰度值为1的更改为3等等

3. 代码实现

cv库里面的计算直方图的函数为:hist = cv2.calcHist([img],[0],None,[256],[0,256])

  • [img] img为图像
  • [0] 为通道,如果是彩色图像可以填[0][1][1] 计算不同的RGB通道
  • mask = None ,掩膜操作
  • [256] 图像的灰度级
  • [0,256] 图像灰度值的动态范围

直方图均衡化的函数为:dst = cv2.equalizeHist(img)

import numpy as np
import cv2
import matplotlib.pyplot as plt

img = cv2.imread('./img.png',0)  # 读取灰度图像

hist = cv2.calcHist([img],[0],None,[256],[0,256])     # 原图的直方图
dst = cv2.equalizeHist(img)
hist_dst = cv2.calcHist([dst],[0],None,[256],[0,256])  # 均衡化之后的直方图

plt.plot(hist,color = 'b',label = 'blue')
plt.plot(hist_dst,color = 'r',label = 'red')
plt.legend()  # 显示图例
plt.show()

cv2.imshow('img',np.hstack((img,dst)))
cv2.waitKey()
cv2.destroyAllWindows()

处理图像效果

空域变换-直方图均衡化(直方图修正)_第2张图片

图像直方图对比

空域变换-直方图均衡化(直方图修正)_第3张图片

你可能感兴趣的:(数字图像处理,计算机视觉,图像处理,人工智能)