如何使用OpenCV提取FFT图像中的水平与垂直条纹(排除原点区域)
问题描述
我有两张FFT图像,想要用OpenCV提取其中的FFT结构或者水平、垂直条纹(需要排除原点区域)。
原始FFT图像
- 第一张FFT图像:

- 第二张FFT图像:

尝试的代码
image = cv2.imread('fft_img.png', 0) gray_filtered = cv2.inRange(image, 130, 155) ret, th1 = cv2.threshold(image, 150, 160, cv2.THRESH_BINARY+cv2.THRESH_OTSU) adaptive_threshold = cv2.adaptiveThreshold(image, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2) cv2.imshow('Original Image', image) cv2.imshow('In range threshold Image', gray_filtered) cv2.imshow('Adaptive Thresholded Image', adaptive_threshold)
当前处理结果

解决方案
针对FFT图像提取水平/垂直条纹并排除原点的需求,可按以下步骤优化处理:
1. 先屏蔽原点区域
FFT图像中心的原点是直流分量,亮度极高,需先覆盖屏蔽:
import cv2 import numpy as np image = cv2.imread('fft_img.png', 0) h, w = image.shape center = (w//2, h//2) # 用黑色圆形覆盖原点,半径根据图像尺寸调整 cv2.circle(image, center, 30, 0, -1)
2. 提取水平/垂直条纹
结合二值化与形态学操作,精准分离条纹:
提取垂直条纹
# 二值化突出亮条纹,阈值根据图像调整 _, binary = cv2.threshold(image, 120, 255, cv2.THRESH_BINARY) # 构造垂直结构元素,长度按需调整 vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1, 20)) vertical_stripes = cv2.morphologyEx(binary, cv2.MORPH_OPEN, vertical_kernel)
提取水平条纹
# 构造水平结构元素 horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20, 1)) horizontal_stripes = cv2.morphologyEx(binary, cv2.MORPH_OPEN, horizontal_kernel)
3. 合并条纹(可选)
如果需要同时展示水平和垂直条纹,可将两者叠加:
combined = cv2.add(horizontal_stripes, vertical_stripes) cv2.imshow('Combined Stripes', combined) cv2.waitKey(0) cv2.destroyAllWindows()
注意事项
- 原点半径、二值化阈值、结构元素尺寸需根据你的图像实际情况调整
- 若图像噪声较多,可先执行
cv2.GaussianBlur(image, (3,3), 0)做模糊预处理,提升提取精度
内容的提问来源于stack exchange,提问作者mkm
相关产品推荐
相关产品推荐

