python代码实现用pm算法处理图像,实现降噪与图像加强
时间: 2023-08-09 22:10:44 浏览: 117
以下是使用Python实现基于PM算法的自适应中值滤波算法和非局部均值滤波算法的代码:
```python
import cv2
import numpy as np
# 基于PM算法的自适应中值滤波算法
def adaptive_median_filter(img, max_window_size=7, threshold=15):
img_out = np.zeros_like(img)
height, width = img.shape[:2]
for i in range(height):
for j in range(width):
window_size = 3
while window_size <= max_window_size:
x1 = max(i - window_size, 0)
x2 = min(i + window_size, height - 1)
y1 = max(j - window_size, 0)
y2 = min(j + window_size, width - 1)
window = img[x1:x2+1, y1:y2+1]
z_min = np.min(window)
z_max = np.max(window)
z_med = np.median(window)
z_xy = img[i, j]
if z_med - z_min > threshold and z_max - z_med > threshold:
if z_min < z_xy < z_max:
img_out[i, j] = z_xy
else:
img_out[i, j] = z_med
break
else:
window_size += 2
if window_size > max_window_size:
img_out[i, j] = z_med
return img_out
# 基于PM算法的非局部均值滤波算法
def non_local_means_filter(img, h=10, search_window_size=21, patch_size=7):
img_out = np.zeros_like(img)
height, width = img.shape[:2]
pad_size = search_window_size // 2
img_pad = cv2.copyMakeBorder(img, pad_size, pad_size, pad_size, pad_size, cv2.BORDER_REPLICATE)
for i in range(height):
for j in range(width):
x1 = i + pad_size - search_window_size // 2
x2 = i + pad_size + search_window_size // 2
y1 = j + pad_size - search_window_size // 2
y2 = j + pad_size + search_window_size // 2
search_window = img_pad[x1:x2+1, y1:y2+1]
search_window_center = search_window[patch_size:patch_size+1, patch_size:patch_size+1]
weight_sum = 0
pixel_sum = 0
for k in range(pad_size, pad_size+height):
for l in range(pad_size, pad_size+width):
patch = img_pad[k-patch_size:k+patch_size+1, l-patch_size:l+patch_size+1]
patch_center = patch[patch_size:patch_size+1, patch_size:patch_size+1]
diff = np.sum((patch - search_window_center) ** 2)
weight = np.exp(-diff / (h ** 2))
weight_sum += weight
pixel_sum += weight * img_pad[k, l]
img_out[i, j] = pixel_sum / weight_sum
return img_out.astype(np.uint8)
# 测试代码
img = cv2.imread('test.jpg', cv2.IMREAD_GRAYSCALE)
img_adaptive_median = adaptive_median_filter(img)
img_non_local_means = non_local_means_filter(img)
cv2.imshow('Original Image', img)
cv2.imshow('Adaptive Median Filter', img_adaptive_median)
cv2.imshow('Non-Local Means Filter', img_non_local_means)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
需要注意的是,这里使用的是OpenCV库来读取和显示图像,如果没有安装OpenCV库需要先安装。此外,这里只提供了基于PM算法的两种图像处理方法的代码实现,实际应用中需要根据具体情况进行调整和优化。