图像中有明显的胡椒噪声,并且整体亮度偏暗。
- 采用5*5大小的最大值滤波 消除胡椒噪声
- 采用8*8的划分对图像进行自适应直方图均衡
- 5*5大小的中值滤波
- 对所得图像进行灰度指数级变换,gamma = 0.8
利用python在jupyter notebook实现。
2.1 导入需要的包import cv2 import numpy as np import matplotlib.pyplot as plt import copy %matplotlib inline2.2 读取待处理 图像并显示
img = cv2.imread("lina.png")
plt.imshow(img,cmap=plt.get_cmap('gray'))
2.3 查看直方图分布
plt.hist(img.ravel(),256) plt.show()2.4 定义最大值滤波函数
import cv2 as cv
import numpy as np
import copy
def original(i, j, k, ksize, img):
# 找到矩阵坐标
x1 = y1 = -ksize // 2
x2 = y2 = ksize + x1
temp = np.zeros(ksize * ksize)
count = 0
# 处理图像
for m in range(x1, x2):
for n in range(y1, y2):
if i + m < 0 or i + m > img.shape[0] - 1 or j + n < 0 or j + n > img.shape[1] - 1:
temp[count] = img[i, j, k]
else:
temp[count] = img[i + m, j + n, k]
count += 1
return temp
# 自定义最大值滤波器最小值滤波器
def max_min_functin(ksize, img, flag):
img0 = copy.copy(img)
for i in range(0, img.shape[0]):
for j in range(2, img.shape[1]):
for k in range(img.shape[2]):
temp = original(i, j, k, ksize, img0)
if flag == 0:
img[i, j, k] = np.max(temp)
elif flag == 1:
img[i, j, k] = np.min(temp)
return img
max_img = max_min_functin(5, copy.copy(img),0) plt.imshow(max_img)
经过最大值滤波很好的消除了胡椒噪声
def adp_histeq(img,clip,size):
equ = cv2.equalizeHist(img) #直接进行直方图均衡
clahe = cv2.createCLAHE(2.0,(size,size))
res_clahe = clahe.apply(img)
res = np.hstack((img,equ,res_clahe))
return equ,res_clahe
进行自适应直方图均衡,得到结果。
equ,clahe = adp_histeq(max_img[:,:,1],40,8)
plt.imshow(clahe,cmap=plt.get_cmap('gray'))
2.6 中值滤波
blur_img = cv2.medianBlur(clahe,5)
plt.imshow(blur_img,cmap=plt.get_cmap('gray'))
2.7 指数变换
power_img = np.power(blur_img,0.8)
plt.imshow(power_img,cmap=plt.get_cmap('gray'))
得到最终结果



