Mengukur ketajaman menggunakan frekuensi [duplikat]

Saya memiliki beberapa gambar dari objek yang sama yang ingin saya rangking berdasarkan ketajaman. Misalnya, untuk menentukan peringkat kualitas fokus.

Dari teori saya tahu bahwa ketika Anda membuat gambar menjadi kurang tajam, Anda kehilangan frekuensi tinggi. Untuk mengujinya saya mengonversi tiga gambar ke domain frekuensi:

masukkan deskripsi gambar di sini

Jelas bahwa gambar buram memiliki frekuensi lebih tinggi yang lebih seragam karena noise. Tapi apa cara yang baik untuk mengukurnya? Saya mencoba mendapatkan rata-rata piksel pada jarak tertentu dari piksel paling terang, tetapi hasilnya tidak menunjukkan banyak perbedaan

Bagaimana saya menggunakan metode ini untuk menemukan gambar paling tajam.

Berikut kode yang saya gunakan untuk membuat gambar di atas:

%make gaussian filter
S=10;P=1.5;
x = [-S/2:1:S/2];
x = exp(-x.^2/(2*P^2));
filt = x'*x;filt = filt/sum(filt(:));

%laplacian kernel
LapK = [0 1 0; 1 -4 1 ; 0 1 0];

%get demo image
Iorg = imread('peppers.png');
Iorg = mean(Iorg,3);
Iorg = Iorg./max(Iorg(:));

%mesh grid
[X,Y]=meshgrid(1:size(Iorg,2),1:size(Iorg,1));
R = sqrt(X.^2+Y.^2);
Rmax = min(size(Iorg)./2);

%Add noise and fourier transform
I = Iorg+randn(size(Iorg))*0.01;I = I./max(I(:));
L = conv2(I,LapK); L1 = max(L(:));
F = fft2(Iorg);
%Radial mean
RadM1=nan([1,Rmax]);
for ct = 1:Rmax
    RadM1(ct) = mean(abs(F(R<=ct&R>(ct-1))));
end
figure(1);clf;colormap jet
subplot(3,3,1);imagesc(repmat(Iorg,[1,1,3]));axis image off;title('image');
subplot(3,3,2);imagesc(log(abs(fftshift(F))),[-4 10]);axis image off;title('fourier transform');
subplot(3,3,3);plot(1:Rmax,log(RadM1),'.-');title('radial mean');
ylabel('log(|F|)');ylim([2 12])

%filter
I=conv2(Iorg, filt, 'same');
%Add noise and fourier transform
I = I+randn(size(Iorg))*0.01;I = I./max(I(:));
L = conv2(I,LapK); L2 = max(L(:));
F = fft2(I);
%Radial mean
RadM2=nan([1,Rmax]);
for ct = 1:Rmax
    RadM2(ct) = mean(abs(F(R<=ct&R>(ct-1))));
end
subplot(3,3,4);imagesc(repmat(I,[1,1,3]));axis image off;title('filtered once');
subplot(3,3,5);imagesc(log(abs(fftshift(F))),[-4 10]);axis image off;title('fourier transform');
subplot(3,3,6);plot(1:Rmax,log(RadM2),'.-');title('radial mean');
ylabel('log(|F|)');ylim([2 12])

%filter twice
I=conv2(Iorg, filt, 'same');I=conv2(I, filt, 'same');
%Add noise and fourier transform
I = I+randn(size(Iorg))*0.01; I = I./max(I(:));
L = conv2(I,LapK); L3 = max(L(:));
F = fft2(I);
%Radial mean
RadM3=nan([1,Rmax]);
for ct = 1:Rmax
    RadM3(ct) = mean(abs(F(R<=ct&R>(ct-1))));
end
subplot(3,3,7);imagesc(repmat(I,[1,1,3]));axis image off;title('filtered twice');
subplot(3,3,8);imagesc(log(abs(fftshift(F))),[-4 10]);axis image off;title('fourier transform');
subplot(3,3,9);plot(1:Rmax,log(RadM3),'.-');title('radial mean');
ylabel('log(|F|)');ylim([2 12])
xlabel('radius(pix)');
fprintf(1,'1: %.2f \n2: %.2f \n3: %.2f\n',L1,L2,L3)

hasil

1: 1.04

2: 0.35

3: 0.27

[sunting] Ini memang duplikat. Konvolusi dengan kernel laplacian dan mencari hasil maksimal berfungsi dengan baik dalam kasus ini. [/ sunting]


person Gelliant    schedule 05.04.2018    source sumber
comment
Ini adalah masalah yang sedang dipelajari. Cari Akutansi. Lihat postingan DSP ini: dsp.stackexchange.com/questions/35490/ dan yang lebih menarik lagi yang ini: stackoverflow.com/questions/7765810/ . Singkatnya, metode yang sangat bagus adalah menggunakan Laplacian of Gaussian, bekerja dengan cukup baik. Saya sendiri telah menggunakannya di masa lalu dalam artikel ilmiah untuk tujuan ini.   -  person Ander Biguri    schedule 05.04.2018
comment
Saya enggan untuk menutup ini sebagai duplikat dari yang kedua karena Anda telah berupaya keras memeriksa FFT dan Anda mungkin mencari solusi dengan menggunakannya, tetapi jika LoG berfungsi untuk Anda, beri tahu saya agar kami dapat menutupnya sebagai duplikat;)   -  person Ander Biguri    schedule 05.04.2018
comment
Terima kasih Ander Biguri. Pendekatannya mungkin sedikit berbeda tetapi sebenarnya merupakan duplikat. Saya tidak dapat menemukannya, maaf. Ide untuk mengambil rata-rata dari 90% frekuensi tertinggi adalah jawaban yang bagus untuk pertanyaan saya.   -  person Gelliant    schedule 05.04.2018
comment
Uji output pemfilteran LoG maksimum. Ini sangat dapat diandalkan untuk tugas ini (pada akhirnya, filter LoG adalah filter lolos tinggi ke gambar, yang pada akhirnya adalah apa yang Anda lakukan dengan hal-hal FFT)   -  person Ander Biguri    schedule 05.04.2018
comment
Baru saja mengujinya dan berfungsi dengan baik.   -  person Gelliant    schedule 06.04.2018