2015-04-05 29 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