You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用OpenCV提取FFT图像中的水平与垂直条纹(排除原点区域)

问题描述

我有两张FFT图像,想要用OpenCV提取其中的FFT结构或者水平、垂直条纹(需要排除原点区域)。

原始FFT图像

  • 第一张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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 16:22:55