使用基于小波变换的去噪方法 去除图片中的低频噪音 python opencv、
时间: 2024-02-05 15:13:19 浏览: 210
可以使用OpenCV中的小波变换函数cv2.dwt()来实现基于小波变换的去噪方法。下面是一个简单的示例代码:
```python
import cv2
import numpy as np
# 读取图像
img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)
# 使用小波变换进行去噪
coeffs = cv2.dwt2(img, 'haar')
LL, (LH, HL, HH) = coeffs
LL[np.where(np.abs(LL) < 10)] = 0
coeffs = LL, (LH, HL, HH)
dst = cv2.idwt2(coeffs, 'haar')
# 显示原始图像和去噪后的图像
cv2.imshow("Original", img)
cv2.imshow("Denoised", dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
在上面的代码中,我们首先使用cv2.dwt2()函数对图像进行小波变换,然后将低频分量LL中小于10的值置为0,最后使用cv2.idwt2()函数将变换后的系数还原为图像。可以根据实际情况调整阈值大小以达到更好的去噪效果。
相关问题
帮我用opencv 4.0.1 和python 3.8写一份代码要求如下: 使用小波变换pywt.wavedec2将输入图像进行分解,分解成高频、低频部分 并将高频、低频部分显示出来 若低频部分出现许多黑色板块 请帮我去除 尽量保留黑色板块处对应输入图像所在位置的形状 随后对低频部分执行灰度形态学操作,构造 0°、45°、90°和135°四种方向的元素形状对低频部分进行灰度闭运算操作 扩大划痕的宽度、或则将接近连续的划痕连接起来 之后采用 5×5 中值滤波 对高频部分进行去噪处理 去除噪音 保留轮廓 随后使用小波逆变换将低频、高频部分重新合起来 并展示
以下是使用Opencv 4.0.1和Python 3.8实现要求的代码:
```python
import cv2
import pywt
import numpy as np
# 读取输入图像
img = cv2.imread('input.jpg', cv2.IMREAD_GRAYSCALE)
# 小波变换分解
coeffs = pywt.wavedec2(img, 'haar', level=3)
# 获取低频部分
cA3, cH3, cV3, cD3 = coeffs
cA2, cH2, cV2, cD2 = cA3, cH3, cV3, cD3
cA1, cH1, cV1, cD1 = cA2, cH2, cV2, cD2
cA, cH, cV, cD = cA1, cH1, cV1, cD1
# 显示低频部分
cv2.imshow('Low-frequency part', cA)
# 去除低频部分中的黑色板块
_, thresh = cv2.threshold(cA, 30, 255, cv2.THRESH_BINARY)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7))
closed = cv2.morphologyEx(thresh, cv2.MORPH_CLOSE, kernel)
opened = cv2.morphologyEx(closed, cv2.MORPH_OPEN, kernel)
mask = cv2.bitwise_not(opened)
cA = cv2.bitwise_and(cA, cA, mask=mask)
# 显示处理后的低频部分
cv2.imshow('Processed low-frequency part', cA)
# 构造灰度形态学操作的元素形状
kernel = np.zeros((5, 5), dtype=np.uint8)
kernel[2, :] = 1
kernel[:, 2] = 1
kernel45 = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 5))
kernel90 = cv2.rotate(kernel, cv2.ROTATE_90_CLOCKWISE)
kernel135 = cv2.rotate(kernel, cv2.ROTATE_180)
# 对低频部分进行灰度闭运算操作
cA = cv2.morphologyEx(cA, cv2.MORPH_CLOSE, kernel)
cA45 = cv2.morphologyEx(cA, cv2.MORPH_CLOSE, kernel45)
cA90 = cv2.morphologyEx(cA, cv2.MORPH_CLOSE, kernel90)
cA135 = cv2.morphologyEx(cA, cv2.MORPH_CLOSE, kernel135)
# 显示四个方向上处理后的低频部分
cv2.imshow('Processed low-frequency part (0 degree)', cA)
cv2.imshow('Processed low-frequency part (45 degree)', cA45)
cv2.imshow('Processed low-frequency part (90 degree)', cA90)
cv2.imshow('Processed low-frequency part (135 degree)', cA135)
# 对高频部分进行中值滤波去噪
cH = cv2.medianBlur(cH, 5)
cV = cv2.medianBlur(cV, 5)
cD = cv2.medianBlur(cD, 5)
# 小波逆变换合并低频、高频部分
coeffs = cA, (cH, cV, cD)
img_reconstructed = pywt.waverec2(coeffs, 'haar')
# 显示重构后的图像
cv2.imshow('Reconstructed image', img_reconstructed)
# 等待按下任意按键后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()
```
其中,`input.jpg`是输入图像的文件名,可以根据实际情况修改。注意,在运行代码之前需要先安装Opencv和pywt库。
图像处理 使用python 3.8和opencv 4.0.1 图像进行小波变换coeffs = pywt.dwt2(gray, 'haar')、cA, (cH, cV, cD) = coeffs 并对低频部分执行灰度形态学操作,构造 0°、45°、90°和135°四种方向的元素形状对低频部分进行灰度闭运算操作 扩大划痕的宽度、或则将接近连续的划痕连接起来 之后采用 5×5 中值滤波 对高频部分进行去噪处理 去除噪音 保留轮廓 并显示低频、高频部分图像 最后进行逆变换 将逆变换的图像显示出来 请示例
下面是一个示例代码,其中使用了 OpenCV 和 PyWavelets 库,实现了对图像进行小波变换、形态学操作、中值滤波和逆变换:
```python
import cv2
import numpy as np
import pywt
def morphology_process(img):
# 构造四个方向的元素形状
kernel_0 = np.array([[0, 0, 0], [1, 1, 1], [0, 0, 0]], dtype=np.uint8)
kernel_45 = np.array([[0, 0, 1], [0, 1, 0], [1, 0, 0]], dtype=np.uint8)
kernel_90 = np.array([[0, 1, 0], [0, 1, 0], [0, 1, 0]], dtype=np.uint8)
kernel_135 = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1]], dtype=np.uint8)
# 对低频部分进行灰度闭运算操作
cA_morph = cv2.morphologyEx(cA, cv2.MORPH_CLOSE, kernel_0)
cA_morph = cv2.morphologyEx(cA_morph, cv2.MORPH_CLOSE, kernel_45)
cA_morph = cv2.morphologyEx(cA_morph, cv2.MORPH_CLOSE, kernel_90)
cA_morph = cv2.morphologyEx(cA_morph, cv2.MORPH_CLOSE, kernel_135)
return cA_morph
# 读取图像并进行小波变换
img = cv2.imread('lena.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
coeffs = pywt.dwt2(gray, 'haar')
cA, (cH, cV, cD) = coeffs
# 对低频部分进行形态学操作
cA_morph = morphology_process(cA)
# 对高频部分进行中值滤波去噪
cH = cv2.medianBlur(cH, 5)
cV = cv2.medianBlur(cV, 5)
cD = cv2.medianBlur(cD, 5)
# 重构图像
coeffs = cA_morph, (cH, cV, cD)
reconstructed_img = pywt.idwt2(coeffs, 'haar')
# 显示低频、高频部分
cv2.imshow('Low Frequencies', cA_morph.astype(np.uint8))
cv2.imshow('High Frequencies', cv2.merge([cH, cV, cD]).astype(np.uint8))
cv2.waitKey(0)
# 显示重构后的图像
reconstructed_img = reconstructed_img.astype(np.uint8)
cv2.imshow('Reconstructed Image', reconstructed_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
代码中首先读取了一张彩色图像并将其转换为灰度图像,然后使用 pywt.dwt2() 函数进行小波变换,得到低频部分 cA 和高频部分 cH、cV、cD 四个系数。
为了去除低频部分的划痕,我们先使用形态学闭运算对 cA 系数进行处理,将四个方向的元素形状进行叠加。然后使用 OpenCV 的 medianBlur() 函数对高频部分进行中值滤波去噪。
最后,将处理后的系数 cA_morph、cH、cV、cD 组合起来,使用 pywt.idwt2() 函数进行逆变换,得到重构后的图像。我们还可以使用 OpenCV 的 imshow() 函数显示低频、高频部分和重构后的图像。
阅读全文