直方图绘制

把图像拆解为像素点,统计里面的值出现次数

可以直观地了解该图像的对比度,亮度,强度分布等。

横坐标为像素数值,纵坐标为频数

函数:

hist = cv2.calcHist([img], [0], None, [256], [0, 256])

绘制:

创建 mask 掩码:

mask = np.zeros(img, shape[:2], np.uint8)
mask[100:300, 100:400] = 255


要保留的位置置为 8'b1111_1111,其余为 0

hist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])

直方图均衡化

提升色彩和亮度 映射关系:

代码:

equ = cv2.equalizeHist(img)

自适应均衡化

防止一些细节被“平均”,导致细节丢失 因此要分成格子,分别均衡化 (并且有一些线性插值处理,防止块间边界),但是这样容易受到噪音影响,要权衡考虑

代码:

clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
res = clahe.apply(img)

傅里叶变换

频率

  • 高频:变化剧烈的灰度分量,例如边界
  • 低频:变化缓慢的灰度分析,例如海面

滤波

  • 低通滤波器:只保留低频,会使得图像模糊
  • 高通滤波器:只保留高频,会增强图像细节

频域转换

  • 函数:dft()idft(),分别为傅里叶变换和逆变换,输入前先转换成 np.float32 格式。
  • 得到的结果,0 频率在左上角,通常用 shift 变换转到中心,反之用 ishift 转移回去。
  • cv2.dft() 返回结果为双通道(虚实部),通常要转化为图像形式显示 距离中心点越近,频率越低

滤波操作

滤波后逆变换展示图片

  • 低通滤波

结果:

  • 高通滤波

结果: