2015-04-05 142 views
0

您好我现在想要绘制掩模,然后对图像进行FFT运算后得到幅度谱。然而,使用霍夫线等,我得到太多的线和面具失败。这里是链接到图像和口罩,我需要提前如何在FFT幅度谱上绘制掩模线

这里创建

https://www.dropbox.com/s/vgbmf3ju50uf821/fftimg4.jpg?dl=0 https://www.dropbox.com/s/ktl0yghan9t868o/image4.jpg?dl=0

由于是代码

import cv2 
import numpy as np 
from matplotlib import pyplot as plt 
from scipy.misc import imshow, imsave, imread ,imsave 
import mahotas 


scaler = .5 
img = imread("color2.jpeg")[:,:,:3] 
mask = imread("image4.jpg")[:,:,:3] 

img = cv2.resize(img, (0,0), fx=scaler, fy=scaler) 
imggray = np.mean(img, -1) 
imfft = np.fft.fft2(imggray) 
mags = np.abs(np.fft.fftshift(imfft)) 
angles = np.angle(np.fft.fftshift(imfft)) 
visual = np.log(mags) 
visual2 = (visual - visual.min())/(visual.max() - visual.min())*255 
cv2.imshow('Visual 2', visual2.astype(np.uint8)) 

imsave('fftimg4.jpg',visual2) 

height,width,depth = img.shape 
masking = np.zeros((height,width)) 

vis = visual2.astype(np.uint8) 
edges = cv2.Canny(vis,50,180) 
cv2.imshow('Gradient', edges) 

lines = cv2.HoughLines(edges,1,np.pi/180,200,200,10) 
for rho,theta in lines[0]: 
    a = np.cos(theta) 
    b = np.sin(theta) 
    x0 = a*rho 
    y0 = b*rho 
    x1 = int(x0 + 1000*(-b)) 
    y1 = int(y0 + 1000*(a)) 
    x2 = int(x0 - 1000*(-b)) 
    y2 = int(y0 - 1000*(a)) 

    cv2.line(masking,(x1,y1),(x2,y2),(255,255,255),1) 

    cv2.imshow('HoughLines', masking) 

    mask = (np.mean(mask,-1) > 20) 
    visual[mask] = np.mean(visual) 
    newmagsshift = np.exp(visual) 
    newffts = newmagsshift * np.exp(1j*angles) 
    newfft = np.fft.ifftshift(newffts) 
    imrev = np.fft.ifft2(newfft) 
    newim2 = 255 - np.abs(imrev).astype(np.uint8) 
    imsave("fftimg2.jpg", newim2 ) 

    cv2.imshow('Image without Lines', newim2.astype(np.uint8)) 

cv2.waitKey(0) 
+0

您好,欢迎来到Stack Overflow,如果您明确指出您的问题并提供显示您尝试解决方案的源代码,那么您将会收到更好的回应。 – reticentroot 2015-04-05 12:11:08

+0

也许可以尝试减小Hough空间的粒度,这样可以减少输出。因此,不要说1度的粒度,在你的霍夫空间中对应于3或5度的“垃圾箱”更少。 – 2015-04-05 12:16:55

+0

注意@ msanti这里是原始图像https://www.dropbox.com/s/kiox2jcnxtkpg15/color2.jpeg?dl=0 – 2015-04-05 13:03:16

回答

0

首先,请澄清。在fft中,你至少有三条“垂直”线和一组“水平线”,这是否正确?另外,你是否真的需要自动化,或者这个过滤可能是手动完成的?你的hough线算法是否给你一堆线的方程?

看来你可以过滤那些经过零的行,因为这是你所期望的。经过零点,也最接近预期角度(例如-5度)。

+0

要更准确它是fft2。我已将代码添加到原始消息 – 2015-04-05 12:54:21

+0

中仍然没有回答以下问题:1)应该如何实现自动化,您是否可以容忍用户从选项中选择正确的掩码? 2)如果不是,对于不同的样本,2D-FFT有多相似,你能预先选择你真正想要的线的类型(比如角度)吗? 2.1)为什么不从选项中挑选最长的线,并使用它来滚动? – aaaaaa 2015-04-05 20:17:56

+0

它应该完全自动化,因为它将输入到另一个模块中。不,它不能是用户驱动器,因为我正在使用它来移除存在某些图像的纸张上的格线,如果您运行我的代码,则每个扫描页面的掩码都会不同,如果您运行我的代码,您将获得多行不同的角度 – 2015-04-06 04:56:33