Matlab में FFT का उपयोग करते हुए एक चित्र में पैटर्न और शोर निकालना




design-patterns image-processing (2)

मैं स्पष्ट पैटर्न / शोर से छुटकारा पाने में सक्षम होने के लिए clown.jpg छवि का उपयोग कर रहा हूँ।

छवि का एफएफटी लेने से पहले मैंने जो पहला कदम किया था, उसे दो की शक्तियों की एक चौकोर छवि (यानी 256 x 256) को पुन: आकार देना है। Matlab में FFT और fftshift का उपयोग करते हुए तेज फूरियर को चित्र में केंद्रित तीव्रता के साथ बदल देता है। निम्नलिखित चित्र का उल्लेख पिछले कार्यों का उपयोग करने का परिणाम है

मैं नीचे "FFT" चित्र पर मैन्युअल रूप से "सितारों" को शून्य करके पैटर्न / शोर को हटाने में सफल रहा था:

IFFT लेना मुझे चित्र की एक बेहतर गुणवत्ता मिलती है (दिखाया नहीं गया)।

मेरे पास यह सवाल है कि "सितारों" को शून्य करने का एक स्वचालित तरीका क्या है? मैंने छवियों को शून्य करने के लिए अंतराल बनाया है क्योंकि हम प्रतिभाशाली "स्टार", डीसी घटक, और न ही कम मूल्यों को निकालना चाहते हैं। ऐसा सीमा नीचे दी गई है:

filter = (fLog > .7*max(fLog(:)) ) | (fLog < .25*max(fLog(:)) )

where fLog is the log(1+abs(Fourier image)) and .7 and .25 are the corresponding
interval percentages.

उत्पादन मुखौटा (जो मैं फूरियर छवि में गुणा करेगा) नीचे पाया गया है। ब्लैक 0 के मान से मेल खाती है और सफेद 1 से मेल खाती है। नोट करें कि इस मुखौटा का छानने से कुछ "सितारों" को हटा दिया जाता है और कुछ डीसी घटक रखता है। जाहिर है इस विधि का सबसे अच्छा नहीं है

मैं एक उच्च पास फ़िल्टर करने के बारे में पढ़ रहा था, लेकिन ऐसा लगता है कि फूरियर छवि में सभी बाहरी मान निकाल दिए गए हैं। यह मेरे पिछले परीक्षण पर आधारित है (मैं उन चित्रों को शामिल नहीं किया था)

क्या ऐसा कुछ है जो आप डीसी घटक को छोड़कर उच्च तीव्रता के मूल्यों को उजागर करने की सलाह देते हैं। आदर्श रूप से मैं मुखौटा की तरह दिखना चाहता हूं:

स्रोत: http://users.accesscomm.ca/bostrum/Imaging/tips/tip1.html

किसी अन्य साइट में, "उच्चतम और स्तर का उपयोग करने के लिए उल्लेख किया गया था कि केवल रेफरी डॉट्स को बनाए रखने के लिए FFT डेटा को ठीक करें जो कि रेखापुंज पैटर्न का प्रतिनिधित्व करते हैं।" मैं इसे बिल्कुल कैसे करना है पर स्पष्ट नहीं हूँ

स्रोत: http://www.robotplanet.dk/graphics/raster_removal/

आपकी सहायता सराहनीय होगी।

मदद करने के लिए यहां मेरा स्रोत कोड है:

I = imread('clown.jpg'); % Read Image

% convert to grayscale
I = rgb2gray(I);

% normalize the image and conver to doubleI
I = double(mat2gray(I));

% Resize the image
I = imresize(I, [256 256]);

% get the size of the image
[rows,cols] = size(I);

% apply FFT
f = fftshift(fft2(I));

% used to plot the image
fLog = log(1 + abs(f));

% filter by a range based on fLog

filter = (fLog > .7*max(fLog(:)) ) | (fLog < .25*max(fLog(:)) );

B = abs(ifft2(f.*filter));

colormap(gray)
subplot(2,2,1),imagesc(I); title('Original Image')
subplot(2,2,2),imagesc(fLog); title('Fourier Image')
subplot(2,2,3),imagesc(filter); title('Zeroed Fourier Image')
subplot(2,2,4),imagesc(B); title('Cleaned Image')
annotation('textbox', [0 0.9 1 0.1], ...
    'String', 'Fourier Analysis on Clown Image', ...
    'EdgeColor', 'none', ...
    'HorizontalAlignment', 'center', ...
    'FontSize', 15, ...
    'FontWeight', 'bold')

मैंने आवृत्ति डोमेन में स्थानीय अधिकतम परिमाण का पता लगाने की कोशिश की, और अपने पड़ोस के साथ उन्हें शून्य कर दिया। यह बिल्कुल साफ नहीं है, लेकिन कम से कम कुछ हद तक कुछ स्वचालित-शून्य महसूस करते हैं।

मेरा कोड:

I=I-mean(I(:));
f = fftshift(fft2(I));
fabs=abs(f);

roi=3;thresh=400;
local_extr = ordfilt2(fabs, roi^2, ones(roi));  % find local maximum within 3*3 range

result = (fabs == local_extr) & (fabs > thresh);

[r, c] = find(result);
for i=1:length(r)
    if (r(i)-128)^2+(c(i)-128)^2>400   % periodic noise locates in the position outside the 20-pixel-radius circle
        f(r(i)-2:r(i)+2,c(i)-2:c(i)+2)=0;  % zero the frequency components
    end
end

Inew=ifft2(fftshift(f));
imagesc(real(Inew)),colormap(gray),

मैंने हाल ही में अपने होमवर्क के लिए अपने पायदान पर लिखा है, मैंने एक उदाहरण कोड खोजने के लिए संघर्ष किया, यह मेरा कोड है, मुझे आशा है कि यह मददगार होगा। सभी के लिए धन्यवाद

यह आवधिक शोर को निकालने के लिए फिल्टर को अस्वीकार करने वाला एक आदर्श निशान है।

I = imread('clown.jpg'); %read image
I = imresize(I, [256 256]); %resize image
[m,n] = size(I);%get size of image as m and n
[X,Y]=meshgrid(1:256,1:256); % it is a meshgrid for circle mask
filter=ones(m,n); % filter initially only ones in it
%according to notch filter equation it will find point on image is on    imaginary circle.i found circle coordinates.
for i=1:m-1
  for j=1:n-1
  d0 = i-130)^2 + (j-130)^2 <= 32^2 && (i-130)^2 + (j-130)^2 >=20^2; 
      if d0
         filter(i,j)=0;
     else
         filter(i,j)=1;
     end
   end
 end
f = fftshift(fft2(I));
G = abs(ifft2(f.*filter));
figure(1),imshow(G,[]);




noise