本文主要介绍对《数字图像处理》第三章书中示例图片实现 反转变换、对数变换以及伽马变换的代码
若要获取更多数字图像处理,python,深度学习,机器学习,计算机视觉等高清PDF以及 更多有意思的 分享,可搜一搜 微信公共号 “分享猿” 免费获取资源。也可扫描下面的二维码关注,期待你的到来~
图像增强的三类基本函数:线性函数(反转和恒等变换)、对数函数(对数和反对数变换)、幂律函数(n次幂和n次跟变换)
一、反转变换
import cv2
import numpy as np
img = cv2.imread(r'C:\Users\xxx\Desktop\breast.tif',0)
reverse_img = 255 - img
cv2.imshow('srcimg',img)
cv2.imshow('reverse_img',reverse_img)
cv2.waitKey(0)
下列分别是乳房X射线原始图及用上式给出的反转图像
二、对数变换
公式:s=clog(1+r)
下图是当c=1时的r与s关系图
代码实现
import cv2
import math
import numpy as np
def logTransform(c,img):
#3通道RGB
'''h,w,d = img.shape[0],img.shape[1],img.shape[2]
new_img = np.zeros((h,w,d))
for i in range(h):
for j in range(w):
for k in range(d):
new_img[i,j,k] = c*(math.log(1.0+img[i,j,k]))'''
#灰度图专属
h,w = img.shape[0], img.shape[1]
new_img = np.zeros((h, w))
for i in range(h):
for j in range(w):
new_img[i, j] = c * (math.log(1.0 + img[i, j]))
new_img = cv2.normalize(new_img,new_img,0,255,cv2.NORM_MINMAX)
return new_img
#替换为你的图片路径
img = cv2.imread(r'C:\Users\xxx\Desktop\Fourier spectrum.tif',0)
log_img = logTransform(1.0,img)
cv2.imshow('log_img',log_img)
cv2.imwrite(r'C:\Users\xxx\Desktop\Fourier spectrum2.jpg',log_img)
cv2.waitKey(0)
备注:当r=255时,s=5.541
下列图像分别是傅里叶频谱和应用上式中的对数变换(c=1)的结果
由于对数曲线在像素值较低的区域斜率大,在像素值较高的区域斜率较小,所以图像经过对数变换后,较暗区域的对比度将有所提升。可用于增强图像的暗部细节。
三、幂律(伽马)变化
公式:s=cr^γ
其中c、γ 为常数。考虑偏移量上式可写为 s=c(ε+r)^γ
对于不同的 γ 值,s 与 r的关系曲线如下图所示
伽马变换可以很好地拉伸图像的对比度,扩展灰度级。
由图可知,
当图像的整体灰度偏暗时,选择γ<1,可以使图像增亮;
当图像的整体灰度偏亮时,选择γ>1,可以使图像变暗,
提高图像的对比度,凸显细节。
用于图像获取、打印和显示的各种设备根据幂律来产生响应,用于校正这些幂律响应现象的处理称为伽马校正。
例如,阴极射线管(CRT)设备有一个灰度-电压响应,该响应是一个指数变化范围约为1.8~2.5的幂函数。
代码实现
import math
import numpy as np
import cv2
def gammaTranform(c,gamma,image):
h,w,d = image.shape[0],image.shape[1],image.shape[2]
new_img = np.zeros((h,w,d),dtype=np.float32)
for i in range(h):
for j in range(w):
new_img[i,j,0] = c*math.pow(image[i, j, 0], gamma)
new_img[i,j,1] = c*math.pow(image[i, j, 1], gamma)
new_img[i,j,2] = c*math.pow(image[i, j, 2], gamma)
cv2.normalize(new_img,new_img,0,255,cv2.NORM_MINMAX)
new_img = cv2.convertScaleAbs(new_img)
return new_img
img = cv2.imread(r'C:\Users\xxx\Desktop\gray.jpg',1)
new_img = gammaTranform(1,2.5,img)
cv2.imshow('x',new_img)
cv2.imwrite(r'C:\Users\xxx\Desktop\gray_2.5.jpg',new_img)
cv2.waitKey(0)
下图是用变换s = r^1/2.5 = r^0.4进行伽马校正的示例的结果
一般,随着设备的不同,伽马值也不同
使用幂律变换进行对比度增强
①γ<1 增强亮度
分别是原图,以及c=1时的γ=0.6、0.4、0.3时应用上公示的结果
②γ>1 增强暗度
航拍图像
下面三幅图片分别是c=1时γ等于3.0、4.0、5.0时应用公式变换的结果
搜索公众号“分享猿”,并回复关键词“代码”,获取本文全部代码
留言或者公众号关注我,我们一起分享数字图像处理心得,一起交流学习吧~