如何用Python、OpenCV等IP库去除遥感图像中的亮非连续垂直条纹?
去除遥感图像中亮非连续垂直条纹的实现方案
当然可以用Python结合OpenCV或其他图像处理库去除这类条纹,下面是几种实用的落地方法:
1. 自适应中值滤波(针对性处理非连续条纹)
这种方法先定位亮条纹区域,再用中值滤波后的像素替换条纹,既能去掉条纹又能保留图像细节:
import cv2 import numpy as np # 读取灰度图像 img = cv2.imread('remote_sense_img.jpg', 0) # 用OTSU阈值自动定位亮条纹 _, stripe_mask = cv2.threshold(img, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU) # 垂直膨胀掩码,把非连续的条纹连接起来 vertical_kernel = np.ones((5, 1), np.uint8) stripe_mask = cv2.dilate(stripe_mask, vertical_kernel, iterations=1) # 对原图像做中值滤波,生成修复用的模板 filtered_img = cv2.medianBlur(img, 5) # 用模板替换条纹区域 fixed_img = np.where(stripe_mask == 255, filtered_img, img) # 保存处理后的图像 cv2.imwrite('fixed_median.jpg', fixed_img)
2. 频域滤波(傅里叶变换去除垂直高频干扰)
垂直条纹在频域中会呈现为垂直方向的亮线,通过傅里叶变换屏蔽这些高频分量即可消除条纹:
import cv2 import numpy as np img = cv2.imread('remote_sense_img.jpg', 0) # 傅里叶变换并将低频移到中心 fourier = np.fft.fft2(img) fourier_shift = np.fft.fftshift(fourier) rows, cols = img.shape center_row, center_col = rows // 2, cols // 2 # 构建频域掩码,遮挡中心附近的垂直高频带(可根据条纹密度调整宽度) mask = np.ones((rows, cols), np.uint8) mask[:, center_col - 8:center_col + 8] = 0 # 应用掩码并逆傅里叶变换 fourier_masked = fourier_shift * mask fourier_ishift = np.fft.ifftshift(fourier_masked) fixed_img = np.fft.ifft2(fourier_ishift) fixed_img = np.abs(fixed_img) # 转换为8位图像并保存 fixed_img = np.uint8(fixed_img) cv2.imwrite('fixed_fft.jpg', fixed_img)
3. 图像修复(Inpaint)
如果条纹区域边界清晰,用OpenCV的inpaint函数可以利用周围像素智能填充条纹区域:
import cv2 import numpy as np # 读取彩色图像(也支持灰度图) img = cv2.imread('remote_sense_img.jpg') gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 生成条纹掩码,阈值可根据图像亮度调整 _, stripe_mask = cv2.threshold(gray, 200, 255, cv2.THRESH_BINARY) # 闭运算优化掩码,填补条纹间隙 stripe_mask = cv2.morphologyEx(stripe_mask, cv2.MORPH_CLOSE, np.ones((3, 3), np.uint8)) # 用TELEA算法修复图像(也可用NSRESTORE算法) fixed_img = cv2.inpaint(img, stripe_mask, 3, cv2.INPAINT_TELEA) cv2.imwrite('fixed_inpaint.jpg', fixed_img)
内容的提问来源于stack exchange,提问作者Atheer
相关产品推荐
相关产品推荐

