经典图像自适应滤波python代码怎么写?
时间: 2024-01-30 17:04:28 浏览: 79
经典图像自适应滤波算法是基于局部统计信息的一种滤波方法,其主要思想是根据每个像素周围邻域像素的均值和方差来进行滤波。在Python中,可以使用OpenCV库来实现经典图像自适应滤波。以下是示例代码:
```python
import cv2
# 读取图像
img = cv2.imread('image.jpg')
# 转为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 经典图像自适应滤波
result = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)
# 显示结果
cv2.imshow('result', result)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,`cv2.adaptiveThreshold()`函数实现了经典图像自适应滤波,其参数含义如下:
- `gray`:输入灰度图像
- `255`:输出图像的最大值
- `cv2.ADAPTIVE_THRESH_MEAN_C`:采用局部像素均值来计算阈值
- `cv2.THRESH_BINARY`:二值化模式
- `11`:邻域大小
- `2`:阈值减小的常数
通过调整邻域大小和阈值减小的常数等参数,可以得到不同的滤波效果。
相关问题
自适应高斯滤波python代码
以下是一个简单的自适应高斯滤波的Python代码:
```python
import cv2
import numpy as np
def adaptive_gaussian_filter(image, kernel_size=5, sigma=5, threshold=0.03):
"""
自适应高斯滤波函数
:param image: 待处理的图像,要求为灰度图像
:param kernel_size: 高斯核的尺寸
:param sigma: 高斯核的标准差
:param threshold: 阈值,决定了是否进行滤波操作
:return: 滤波后的图像
"""
# 1. 计算图像的梯度幅值
grad_x = cv2.Sobel(image, cv2.CV_64F, 1, 0, ksize=3)
grad_y = cv2.Sobel(image, cv2.CV_64F, 0, 1, ksize=3)
grad_mag = np.sqrt(grad_x ** 2 + grad_y ** 2)
# 2. 计算像素点的局部方差
var = cv2.GaussianBlur(grad_mag ** 2, (kernel_size, kernel_size), sigma)
var = var - cv2.blur(grad_mag, (kernel_size, kernel_size))
# 3. 计算自适应系数
coef = np.exp(-np.abs(var) / (2 * (threshold ** 2)))
# 4. 进行滤波操作
filtered_image = cv2.GaussianBlur(image, (kernel_size, kernel_size), sigma)
filtered_image = filtered_image + coef * (image - filtered_image)
return filtered_image
```
该函数接受一个灰度图像,然后计算图像的梯度幅值,并计算每个像素点的局部方差。接着,它根据局部方差计算自适应系数,然后使用自适应系数对图像进行滤波操作。最后,返回滤波后的图像。
自适应中值滤波python代码
以下是自适应中值滤波的Python代码:
```python
import numpy as np
from skimage.morphology import square
from skimage.filters import median
def adaptive_median_filter(img, max_window_size):
img_out = np.zeros_like(img)
img_pad = np.pad(img, max_window_size, mode='symmetric')
for i in range(img.shape[0]):
for j in range(img.shape[1]):
window_size = 3
while window_size <= max_window_size:
window = img_pad[i:i+window_size, j:j+window_size]
median_val = np.median(window)
min_val = np.min(window)
max_val = np.max(window)
if min_val < median_val < max_val:
img_out[i, j] = median_val
break
else:
window_size += 2
if window_size > max_window_size:
img_out[i, j] = median(img_pad[i:i+3, j:j+3], selem=square(3))
break
return img_out
```
其中,`adaptive_median_filter`函数接受两个参数:`img`表示输入的图像,`max_window_size`表示最大的窗口大小。该函数返回经过自适应中值滤波后的图像。
阅读全文