混合图像增强是一种图像处理技术,用于在不损失图像细节的情况下增强图像的对比度和亮度。它通常通过将图像拆分成多个通道,然后对每个通道进行独立处理来实现。
综合利用平滑滤波,锐化滤波,灰度拉伸等技术对图像进行处理,得到更为理想的效果。
这里使用人体骨骼扫描图像来说明。具体流程如上图,由于人体全身骨骼扫描图像灰度动态范围很窄,并且有很大的噪声内容,使用单一滤波对其增强效果一般。具体作用如图:
import numpy as np
from skimage import io, filters
from matplotlib import pyplot as plt
# 空间滤波
def corre12d(img, window):
m = window.shape[0]
n = window.shape[1]
# 边界通过0灰度值填充
img1 = np.zeros((img.shape[0] + m - 1, img.shape[1] + n - 1))
img1[(m - 1) // 2:(img.shape[0] + (m - 1) // 2), (n - 1) // 2:(img.shape[1] + (n - 1) // 2)] = img
img2 = np.zeros(img.shape)
for i in range(img2.shape[0]):
for j in range(img2.shape[1]):
tmp = img1[i:i + m, j:j + n]
img2[i, j] = np.sum(np.multiply(tmp, window))
return img2
I = io.imread("I3.jpg", as_gray=True)
# 拉普拉斯变换
win = np.array([[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]])
I_lap = corre12d(I, win)
I_lap = 255 * (I_lap - I_lap.min()) / (I_lap.max() - I_lap.min())
# 相加得锐化增强图
I_lap_enhance = I + I_lap
# sobel处理
I_sobel = filters.sobel(I)
# 5*5均值滤波器
win_mean = np.ones((5, 5)) / (5 ** 2)
I_sobel_mean = corre12d(I_sobel, win_mean)
# 相乘得到掩蔽图像
I_mask = I_lap_enhance * I_sobel_mean
# 相加得到锐化增强
I_sharp_enhance = I + I_mask
# 进行灰度幂律变换
I_enhance = I_sharp_enhance ** 0.5
# 显示
I_list = [I, I_lap, I_lap_enhance, I_sobel, I_sobel_mean, I_mask, I_sharp_enhance, I_enhance]
i = 0
for grayI in I_list:
i = i + 1
plt.subplot(2, 4, i)
plt.axis('off')
plt.title(i)
plt.imshow(grayI, cmap='gray')
plt.show()
从左到右,从上到下依次是:
1:原始图像:
2:1拉普拉斯变化后:
图像全身骨骼扫描,图2为原始图像拉普拉斯变换后的结果,细节信息丰富,同时噪音变多。
3:原始图像与拉普拉斯变换后图像相加得到拉普拉斯锐化增强图像:
4:原始图像Sobel处理 :
图4为原始图像经过Sobel算子处理后结果,边缘信息丰富。
5:均值滤波对4进行平滑:
图4进行空间平滑滤波得到图5,保留图像边缘信息,同时减小了噪声。
6:3*5得到的掩蔽图像:
将图3与图5相加得到图6,发现图6的强边缘优势和可见噪声相对减少。
7:原图与掩蔽图像相加得到的锐化增强图像:
图像的大部分细节更清晰。
8:对7进行灰度幂律变换得到最终结果:
图8进行幂律变换后增大了一些噪声,但同时人体结构更加清晰完整,人体轮廓清晰度也有一定提高。
上图更能直观地观察到图像变换后的差异。