কোনও চিত্র অস্পষ্ট কিনা তা সনাক্ত করার কোনও উপায় আছে?


203

আমি ভাবছিলাম যে কোনও চিত্রটি অস্পষ্ট কিনা তা নির্ধারণ করার কোনও উপায় আছে কিনা তা চিত্রের বিশ্লেষণের মাধ্যমে বিশ্লেষণ করে দেখছিলাম।


7
সম্পর্কিত প্রশ্নগুলির একটি ভাল উত্তর রয়েছে তবে এটি আরও একটি জড়িত প্রশ্ন গঠনের জড়িত। stackoverflow.com/questions/5180327/…
লেনার্ট রোল্যান্ড

1
এর আরও খারাপ উত্তর রয়েছে।
জন শেডলেটস্কি

উত্তর:


133

হ্যাঁ, তাই দ্রুত ফুরিয়ার রূপান্তর গণনা করুন এবং ফলাফলটি বিশ্লেষণ করুন। ফুরিয়ার রূপান্তর আপনাকে জানায় যে চিত্রটিতে কোন ফ্রিকোয়েন্সি উপস্থিত রয়েছে। যদি কম পরিমাণে উচ্চ ফ্রিকোয়েন্সি থাকে তবে চিত্রটি অস্পষ্ট।

'নিম্ন' এবং 'উচ্চ' পদগুলির সংজ্ঞা দেওয়া আপনার হাতে to

সম্পাদনা করুন :

মন্তব্যে যেমন বলা হয়েছে, আপনি যদি কোনও প্রদত্ত চিত্রের অস্পষ্টতা উপস্থাপন করে এমন একক ফ্লোট চান, তবে আপনাকে উপযুক্ত মেট্রিকের কাজ করতে হবে।

নিকির উত্তর যেমন একটি মেট্রিক সরবরাহ করে। একটি ল্যাপ্লেসিয়ান কার্নেল দিয়ে চিত্রটি রূপান্তর করুন:

   1
1 -4  1
   1

এবং আউটপুটে একটি শক্তিশালী সর্বাধিক মেট্রিক ব্যবহার করুন যা আপনি থ্রেশোল্ডিংয়ের জন্য ব্যবহার করতে পারেন। Laplacian গণনা করার আগে খুব বেশি ইমেজ স্মুথ এড়ানোর চেষ্টা করুন, কারণ আপনি কেবল জানতে পারবেন যে একটি স্মুথড চিত্রটি আসলেই অস্পষ্ট :-)।


9
কেবলমাত্র 'নিম্ন' এবং 'উচ্চ' সমস্যাটিও দৃশ নির্ভর। +1
কেনি

4
আপনার চিত্রটি চক্রীয় না হলে আপনার চিত্রের সীমানায় সাধারণত ধারালো প্রান্ত থাকবে যা খুব উচ্চ ফ্রিকোয়েন্সি নিয়ে যায়
নিকি

2
আপনি এই চিত্রটি এড়াতে সাধারণত আপনার চিত্রটি কার্যত বাড়িয়ে তোলেন। স্থানীয় ফিটের গণনা করতে আপনি ছোট উইন্ডোও ব্যবহার করতে পারেন।
সাইমন বার্গোট

6
কেবলমাত্র একটি বিষয় যা অত্যন্ত গুরুত্বপূর্ণ তা হ'ল আপনাকে জানতে হবে (কমপক্ষে মোটামুটিভাবে) আপনার প্রত্যাশিত প্রাক-অস্পষ্ট চিত্র (ফ্রিকোয়েন্সি) সামগ্রীটি কী ছিল। এটি সত্য, যেহেতু ফ্রিকোয়েন্সি বর্ণালীটি অস্পষ্ট ফিল্টারের মূল চিত্রের বার হতে চলেছে। সুতরাং, যদি ইতিমধ্যে মূল চিত্রটির মূলত কম ফ্রিকোয়েন্সি থাকে, তবে এটি কীভাবে বলতে পারেন যে এটি অস্পষ্ট ছিল কিনা?
ক্রিস এ

1
আপনি যদি একটি ফাঁকা সাদা চার্টের ছবি তুলেন তবে আপনার কাছে ছবিটি অস্পষ্ট বা না তা বলার উপায় নেই। আমি মনে করি ওপি কিছু নিখুঁত তীক্ষ্ণতা পরিমাপ চায়। প্রিবার্লার্ড ইমেজটি অস্তিত্বহীন। সঠিক মেট্রিক নিয়ে আসতে আপনাকে কিছুটা কাজ করতে হবে, তবে fft এই সমস্যাটিতে সহায়তা করতে পারে। এই দৃষ্টিকোণে, নিকির উত্তর আমার চেয়ে ভাল।
সাইমন বার্গোট

158

কোনও চিত্রের তীক্ষ্ণতা অনুমান করার আরেকটি খুব সহজ উপায় হ'ল ল্যাপ্লেস (বা এলওজি) ফিল্টারটি ব্যবহার করা এবং সর্বাধিক মান বাছাই করা। আপনি যদি শব্দটি আশা করেন তবে 99.9% কোয়ান্টাইলের মতো শক্তিশালী পরিমাপটি ব্যবহার করা আরও ভাল ( বিপরীতে (যেমন হিস্টোগ্রাম সমতা)।

আমি সাইমনের পরামর্শ এবং এটি ম্যাথমেটিকায় প্রয়োগ করেছি এবং কয়েকটি পরীক্ষার ছবিতে চেষ্টা করেছি:

পরীক্ষা ইমেজ

প্রথম পরীক্ষাটি বিভিন্ন কার্নেল আকারের সাথে গাউসিয়ান ফিল্টার ব্যবহার করে পরীক্ষার চিত্রগুলিকে ঝাপসা করে, তারপরে অস্পষ্ট চিত্রটির এফএফটি গণনা করে এবং 90% সর্বোচ্চ ফ্রিকোয়েন্সি নিয়ে গড় নেয়:

testFft[img_] := Table[
  (
   blurred = GaussianFilter[img, r];
   fft = Fourier[ImageData[blurred]];
   {w, h} = Dimensions[fft];
   windowSize = Round[w/2.1];
   Mean[Flatten[(Abs[
       fft[[w/2 - windowSize ;; w/2 + windowSize, 
         h/2 - windowSize ;; h/2 + windowSize]]])]]
   ), {r, 0, 10, 0.5}]

লগারিদমিক প্লটের ফলাফল:

fft ফলাফল

5 টি লাইন 5 টি পরীক্ষা চিত্রের প্রতিনিধিত্ব করে, এক্স অক্ষটি গাউসিয়ান ফিল্টার ব্যাসার্ধকে উপস্থাপন করে। গ্রাফগুলি হ্রাস পাচ্ছে, তাই এফএফটি তীক্ষ্ণতার জন্য একটি ভাল পরিমাপ।

এটি "সর্বোচ্চ লোজি" অস্পষ্টতা অনুমানের কোড: এটি কেবল একটি এলওজি ফিল্টার প্রয়োগ করে এবং ফিল্টারের ফলাফলের মধ্যে সবচেয়ে উজ্জ্বল পিক্সেল দেয়:

testLaplacian[img_] := Table[
  (
   blurred = GaussianFilter[img, r];
   Max[Flatten[ImageData[LaplacianGaussianFilter[blurred, 1]]]];
   ), {r, 0, 10, 0.5}]

লগারিদমিক প্লটের ফলাফল:

ফলস্বরূপ ফলাফল

অ-অস্পষ্ট চিত্রগুলির জন্য স্প্রেটি এখানে কিছুটা ভাল (2.5 বনাম 3.3), মূলত কারণ এই পদ্ধতিটি কেবল চিত্রের সবচেয়ে শক্তিশালী বৈপরীত্য ব্যবহার করে, যখন এফএফটি মূলত পুরো চিত্রের উপর নির্ভর করে। ফাংশনগুলিও দ্রুত হ্রাস পাচ্ছে, সুতরাং "ঝাপসা" থ্রেশহোল্ড সেট করা আরও সহজ হতে পারে।


1
আমি যদি স্থানীয় অস্পষ্টতার পরিমাপ করছি। যথা, কোনও ফটোতে এমন অঞ্চল রয়েছে যেখানে এটি অস্পষ্ট এবং এটি তীক্ষ্ণ। আমি একটি মানচিত্র রাখতে চাই যা প্রতি পিক্সেলটিতে অস্পষ্ট স্তরের অনুমান করে।
রায়য়

4
@ ড্রাজিক: আমি নিশ্চিত না যে এটি এমনকি সম্ভব কিনা। উদাহরণস্বরূপ, লেনার চিত্রটি দেখুন: এমন অনেক বড় অঞ্চল রয়েছে যেখানে কোনও বিপরীতে নেই (যেমন লেনার ত্বক) যদিও এই অঞ্চলটি ফোকাসে রয়েছে। এ জাতীয় মসৃণ অঞ্চলটি "ঝাপসা" হয় না, বা একে কেন্দ্রের বাইরে স্থান থেকে আলাদা করার কোনও উপায় আমি ভাবতে পারি না। আপনার এটি আলাদা প্রশ্ন হিসাবে জিজ্ঞাসা করা উচিত (সম্ভবত ডিএসপি.এসই তে)। হয়তো অন্য কারও কাছে ভাল ধারণা আছে।
নিকি

1
এটি গতির ঝাপসা জন্য উপযুক্ত? নাকি কেবল গাউসের মতো অস্পষ্টতার জন্য?
mrgloom

আপনি কি আপনার প্রয়োগগুলি ভাগ করতে ইচ্ছুক? আমি তাদের দেখতে কৌতুহলী হতে হবে।
chappjc

@ জনবো আমার মনে হয় আপনি পেপারেসেসেলাস জিজ্ঞাসা করতে চেয়েছিলেন
চ্যাপজক

79

একটি অটো ফোকাস লেন্স দিয়ে কিছু কাজের সময়, আমি চিত্র ফোকাস সনাক্তকরণের জন্য অ্যালগরিদমের এই খুব দরকারী সেটটি পেলাম । এটি ম্যাটল্যাবে প্রয়োগ করা হয়েছে, তবে বেশিরভাগ কার্যকারিতা ওপেনসিভিতে ফিল্টার 2 ডি দিয়ে পোর্ট করা বেশ সহজ ।

এটি মূলত অনেকগুলি ফোকাস পরিমাপের অ্যালগরিদমের জরিপ বাস্তবায়ন। আপনি যদি মূল কাগজপত্র পড়তে চান তবে আলগোরিদিমগুলির লেখকদের উল্লেখগুলি কোডে সরবরাহ করা হয়। পার্টুজের 2012 সালের কাগজ, ইত্যাদি। ফোকাস (এসএফএফ) আকারের জন্য ফোকাস পরিমাপ অপারেটরগুলির বিশ্লেষণ এই সমস্ত পরিমাপের পাশাপাশি তাদের কর্মক্ষমতা (এসএফএফ হিসাবে প্রয়োগের গতি এবং যথার্থতার ক্ষেত্রে উভয়ই) একটি দুর্দান্ত পর্যালোচনা দেয়।

সম্পাদনা: লিঙ্কটি মারা যাওয়ার ক্ষেত্রে ম্যাটল্যাব কোড যুক্ত হয়েছে।

function FM = fmeasure(Image, Measure, ROI)
%This function measures the relative degree of focus of 
%an image. It may be invoked as:
%
%   FM = fmeasure(Image, Method, ROI)
%
%Where 
%   Image,  is a grayscale image and FM is the computed
%           focus value.
%   Method, is the focus measure algorithm as a string.
%           see 'operators.txt' for a list of focus 
%           measure methods. 
%   ROI,    Image ROI as a rectangle [xo yo width heigth].
%           if an empty argument is passed, the whole
%           image is processed.
%
%  Said Pertuz
%  Abr/2010


if ~isempty(ROI)
    Image = imcrop(Image, ROI);
end

WSize = 15; % Size of local window (only some operators)

switch upper(Measure)
    case 'ACMO' % Absolute Central Moment (Shirvaikar2004)
        if ~isinteger(Image), Image = im2uint8(Image);
        end
        FM = AcMomentum(Image);

    case 'BREN' % Brenner's (Santos97)
        [M N] = size(Image);
        DH = Image;
        DV = Image;
        DH(1:M-2,:) = diff(Image,2,1);
        DV(:,1:N-2) = diff(Image,2,2);
        FM = max(DH, DV);        
        FM = FM.^2;
        FM = mean2(FM);

    case 'CONT' % Image contrast (Nanda2001)
        ImContrast = inline('sum(abs(x(:)-x(5)))');
        FM = nlfilter(Image, [3 3], ImContrast);
        FM = mean2(FM);

    case 'CURV' % Image Curvature (Helmli2001)
        if ~isinteger(Image), Image = im2uint8(Image);
        end
        M1 = [-1 0 1;-1 0 1;-1 0 1];
        M2 = [1 0 1;1 0 1;1 0 1];
        P0 = imfilter(Image, M1, 'replicate', 'conv')/6;
        P1 = imfilter(Image, M1', 'replicate', 'conv')/6;
        P2 = 3*imfilter(Image, M2, 'replicate', 'conv')/10 ...
            -imfilter(Image, M2', 'replicate', 'conv')/5;
        P3 = -imfilter(Image, M2, 'replicate', 'conv')/5 ...
            +3*imfilter(Image, M2, 'replicate', 'conv')/10;
        FM = abs(P0) + abs(P1) + abs(P2) + abs(P3);
        FM = mean2(FM);

    case 'DCTE' % DCT energy ratio (Shen2006)
        FM = nlfilter(Image, [8 8], @DctRatio);
        FM = mean2(FM);

    case 'DCTR' % DCT reduced energy ratio (Lee2009)
        FM = nlfilter(Image, [8 8], @ReRatio);
        FM = mean2(FM);

    case 'GDER' % Gaussian derivative (Geusebroek2000)        
        N = floor(WSize/2);
        sig = N/2.5;
        [x,y] = meshgrid(-N:N, -N:N);
        G = exp(-(x.^2+y.^2)/(2*sig^2))/(2*pi*sig);
        Gx = -x.*G/(sig^2);Gx = Gx/sum(Gx(:));
        Gy = -y.*G/(sig^2);Gy = Gy/sum(Gy(:));
        Rx = imfilter(double(Image), Gx, 'conv', 'replicate');
        Ry = imfilter(double(Image), Gy, 'conv', 'replicate');
        FM = Rx.^2+Ry.^2;
        FM = mean2(FM);

    case 'GLVA' % Graylevel variance (Krotkov86)
        FM = std2(Image);

    case 'GLLV' %Graylevel local variance (Pech2000)        
        LVar = stdfilt(Image, ones(WSize,WSize)).^2;
        FM = std2(LVar)^2;

    case 'GLVN' % Normalized GLV (Santos97)
        FM = std2(Image)^2/mean2(Image);

    case 'GRAE' % Energy of gradient (Subbarao92a)
        Ix = Image;
        Iy = Image;
        Iy(1:end-1,:) = diff(Image, 1, 1);
        Ix(:,1:end-1) = diff(Image, 1, 2);
        FM = Ix.^2 + Iy.^2;
        FM = mean2(FM);

    case 'GRAT' % Thresholded gradient (Snatos97)
        Th = 0; %Threshold
        Ix = Image;
        Iy = Image;
        Iy(1:end-1,:) = diff(Image, 1, 1);
        Ix(:,1:end-1) = diff(Image, 1, 2);
        FM = max(abs(Ix), abs(Iy));
        FM(FM<Th)=0;
        FM = sum(FM(:))/sum(sum(FM~=0));

    case 'GRAS' % Squared gradient (Eskicioglu95)
        Ix = diff(Image, 1, 2);
        FM = Ix.^2;
        FM = mean2(FM);

    case 'HELM' %Helmli's mean method (Helmli2001)        
        MEANF = fspecial('average',[WSize WSize]);
        U = imfilter(Image, MEANF, 'replicate');
        R1 = U./Image;
        R1(Image==0)=1;
        index = (U>Image);
        FM = 1./R1;
        FM(index) = R1(index);
        FM = mean2(FM);

    case 'HISE' % Histogram entropy (Krotkov86)
        FM = entropy(Image);

    case 'HISR' % Histogram range (Firestone91)
        FM = max(Image(:))-min(Image(:));


    case 'LAPE' % Energy of laplacian (Subbarao92a)
        LAP = fspecial('laplacian');
        FM = imfilter(Image, LAP, 'replicate', 'conv');
        FM = mean2(FM.^2);

    case 'LAPM' % Modified Laplacian (Nayar89)
        M = [-1 2 -1];        
        Lx = imfilter(Image, M, 'replicate', 'conv');
        Ly = imfilter(Image, M', 'replicate', 'conv');
        FM = abs(Lx) + abs(Ly);
        FM = mean2(FM);

    case 'LAPV' % Variance of laplacian (Pech2000)
        LAP = fspecial('laplacian');
        ILAP = imfilter(Image, LAP, 'replicate', 'conv');
        FM = std2(ILAP)^2;

    case 'LAPD' % Diagonal laplacian (Thelen2009)
        M1 = [-1 2 -1];
        M2 = [0 0 -1;0 2 0;-1 0 0]/sqrt(2);
        M3 = [-1 0 0;0 2 0;0 0 -1]/sqrt(2);
        F1 = imfilter(Image, M1, 'replicate', 'conv');
        F2 = imfilter(Image, M2, 'replicate', 'conv');
        F3 = imfilter(Image, M3, 'replicate', 'conv');
        F4 = imfilter(Image, M1', 'replicate', 'conv');
        FM = abs(F1) + abs(F2) + abs(F3) + abs(F4);
        FM = mean2(FM);

    case 'SFIL' %Steerable filters (Minhas2009)
        % Angles = [0 45 90 135 180 225 270 315];
        N = floor(WSize/2);
        sig = N/2.5;
        [x,y] = meshgrid(-N:N, -N:N);
        G = exp(-(x.^2+y.^2)/(2*sig^2))/(2*pi*sig);
        Gx = -x.*G/(sig^2);Gx = Gx/sum(Gx(:));
        Gy = -y.*G/(sig^2);Gy = Gy/sum(Gy(:));
        R(:,:,1) = imfilter(double(Image), Gx, 'conv', 'replicate');
        R(:,:,2) = imfilter(double(Image), Gy, 'conv', 'replicate');
        R(:,:,3) = cosd(45)*R(:,:,1)+sind(45)*R(:,:,2);
        R(:,:,4) = cosd(135)*R(:,:,1)+sind(135)*R(:,:,2);
        R(:,:,5) = cosd(180)*R(:,:,1)+sind(180)*R(:,:,2);
        R(:,:,6) = cosd(225)*R(:,:,1)+sind(225)*R(:,:,2);
        R(:,:,7) = cosd(270)*R(:,:,1)+sind(270)*R(:,:,2);
        R(:,:,7) = cosd(315)*R(:,:,1)+sind(315)*R(:,:,2);
        FM = max(R,[],3);
        FM = mean2(FM);

    case 'SFRQ' % Spatial frequency (Eskicioglu95)
        Ix = Image;
        Iy = Image;
        Ix(:,1:end-1) = diff(Image, 1, 2);
        Iy(1:end-1,:) = diff(Image, 1, 1);
        FM = mean2(sqrt(double(Iy.^2+Ix.^2)));

    case 'TENG'% Tenengrad (Krotkov86)
        Sx = fspecial('sobel');
        Gx = imfilter(double(Image), Sx, 'replicate', 'conv');
        Gy = imfilter(double(Image), Sx', 'replicate', 'conv');
        FM = Gx.^2 + Gy.^2;
        FM = mean2(FM);

    case 'TENV' % Tenengrad variance (Pech2000)
        Sx = fspecial('sobel');
        Gx = imfilter(double(Image), Sx, 'replicate', 'conv');
        Gy = imfilter(double(Image), Sx', 'replicate', 'conv');
        G = Gx.^2 + Gy.^2;
        FM = std2(G)^2;

    case 'VOLA' % Vollath's correlation (Santos97)
        Image = double(Image);
        I1 = Image; I1(1:end-1,:) = Image(2:end,:);
        I2 = Image; I2(1:end-2,:) = Image(3:end,:);
        Image = Image.*(I1-I2);
        FM = mean2(Image);

    case 'WAVS' %Sum of Wavelet coeffs (Yang2003)
        [C,S] = wavedec2(Image, 1, 'db6');
        H = wrcoef2('h', C, S, 'db6', 1);   
        V = wrcoef2('v', C, S, 'db6', 1);   
        D = wrcoef2('d', C, S, 'db6', 1);   
        FM = abs(H) + abs(V) + abs(D);
        FM = mean2(FM);

    case 'WAVV' %Variance of  Wav...(Yang2003)
        [C,S] = wavedec2(Image, 1, 'db6');
        H = abs(wrcoef2('h', C, S, 'db6', 1));
        V = abs(wrcoef2('v', C, S, 'db6', 1));
        D = abs(wrcoef2('d', C, S, 'db6', 1));
        FM = std2(H)^2+std2(V)+std2(D);

    case 'WAVR'
        [C,S] = wavedec2(Image, 3, 'db6');
        H = abs(wrcoef2('h', C, S, 'db6', 1));   
        V = abs(wrcoef2('v', C, S, 'db6', 1));   
        D = abs(wrcoef2('d', C, S, 'db6', 1)); 
        A1 = abs(wrcoef2('a', C, S, 'db6', 1));
        A2 = abs(wrcoef2('a', C, S, 'db6', 2));
        A3 = abs(wrcoef2('a', C, S, 'db6', 3));
        A = A1 + A2 + A3;
        WH = H.^2 + V.^2 + D.^2;
        WH = mean2(WH);
        WL = mean2(A);
        FM = WH/WL;
    otherwise
        error('Unknown measure %s',upper(Measure))
end
 end
%************************************************************************
function fm = AcMomentum(Image)
[M N] = size(Image);
Hist = imhist(Image)/(M*N);
Hist = abs((0:255)-255*mean2(Image))'.*Hist;
fm = sum(Hist);
end

%******************************************************************
function fm = DctRatio(M)
MT = dct2(M).^2;
fm = (sum(MT(:))-MT(1,1))/MT(1,1);
end

%************************************************************************
function fm = ReRatio(M)
M = dct2(M);
fm = (M(1,2)^2+M(1,3)^2+M(2,1)^2+M(2,2)^2+M(3,1)^2)/(M(1,1)^2);
end
%******************************************************************

ওপেনসিভি সংস্করণগুলির কয়েকটি উদাহরণ:

// OpenCV port of 'LAPM' algorithm (Nayar89)
double modifiedLaplacian(const cv::Mat& src)
{
    cv::Mat M = (Mat_<double>(3, 1) << -1, 2, -1);
    cv::Mat G = cv::getGaussianKernel(3, -1, CV_64F);

    cv::Mat Lx;
    cv::sepFilter2D(src, Lx, CV_64F, M, G);

    cv::Mat Ly;
    cv::sepFilter2D(src, Ly, CV_64F, G, M);

    cv::Mat FM = cv::abs(Lx) + cv::abs(Ly);

    double focusMeasure = cv::mean(FM).val[0];
    return focusMeasure;
}

// OpenCV port of 'LAPV' algorithm (Pech2000)
double varianceOfLaplacian(const cv::Mat& src)
{
    cv::Mat lap;
    cv::Laplacian(src, lap, CV_64F);

    cv::Scalar mu, sigma;
    cv::meanStdDev(lap, mu, sigma);

    double focusMeasure = sigma.val[0]*sigma.val[0];
    return focusMeasure;
}

// OpenCV port of 'TENG' algorithm (Krotkov86)
double tenengrad(const cv::Mat& src, int ksize)
{
    cv::Mat Gx, Gy;
    cv::Sobel(src, Gx, CV_64F, 1, 0, ksize);
    cv::Sobel(src, Gy, CV_64F, 0, 1, ksize);

    cv::Mat FM = Gx.mul(Gx) + Gy.mul(Gy);

    double focusMeasure = cv::mean(FM).val[0];
    return focusMeasure;
}

// OpenCV port of 'GLVN' algorithm (Santos97)
double normalizedGraylevelVariance(const cv::Mat& src)
{
    cv::Scalar mu, sigma;
    cv::meanStdDev(src, mu, sigma);

    double focusMeasure = (sigma.val[0]*sigma.val[0]) / mu.val[0];
    return focusMeasure;
}

এই ব্যবস্থাগুলি আপনার সমস্যার জন্য সেরা পছন্দ কিনা তা নিয়ে কোনও গ্যারান্টি নেই তবে আপনি যদি এই ব্যবস্থাগুলির সাথে যুক্ত কাগজগুলি সন্ধান করেন তবে সেগুলি আপনাকে আরও অন্তর্দৃষ্টি দিতে পারে। আপনি কোড দরকারী খুঁজে পেতে আশা করি! আমি জানি আমি করেছি।


টেনেনগ্রাড অ্যালগরিদমে, কে সাইজের জন্য নামমাত্র মান কী হবে?
ম্যান

@ মানস আমি সাধারণত চিত্রটির রেজোলিউশনের উপর নির্ভর করে 3, 5 বা 7 ব্যবহার করি। যদি আপনি দেখতে পান যে এর চেয়েও বেশি আপনাকে যেতে হবে, আপনি ছবিটি ডাউন স্যাম্পলিংয়ের দিকে চেয়ে দেখতে পারেন।
mevatron

32

নাইকের উত্তর বন্ধ করে দেওয়া। ওপেনসিভি দিয়ে ল্যালাপাসিয়ান ভিত্তিক পদ্ধতিটি বাস্তবায়নের জন্য এটি সোজা:

short GetSharpness(char* data, unsigned int width, unsigned int height)
{
    // assumes that your image is already in planner yuv or 8 bit greyscale
    IplImage* in = cvCreateImage(cvSize(width,height),IPL_DEPTH_8U,1);
    IplImage* out = cvCreateImage(cvSize(width,height),IPL_DEPTH_16S,1);
    memcpy(in->imageData,data,width*height);

    // aperture size of 1 corresponds to the correct matrix
    cvLaplace(in, out, 1);

    short maxLap = -32767;
    short* imgData = (short*)out->imageData;
    for(int i =0;i<(out->imageSize/2);i++)
    {
        if(imgData[i] > maxLap) maxLap = imgData[i];
    }

    cvReleaseImage(&in);
    cvReleaseImage(&out);
    return maxLap;
}

সনাক্ত করা সর্বাধিক তীক্ষ্ণতা নির্দেশ করে একটি সংক্ষিপ্ত ফিরিয়ে দেবে, যা বাস্তব বিশ্বের নমুনাগুলিতে আমার পরীক্ষার উপর ভিত্তি করে ক্যামেরা ফোকাসে আছে বা না থাকলে এটির একটি দুর্দান্ত সূচক। আশ্চর্যের বিষয় নয়, স্বাভাবিক মানগুলি দৃশভিত্তিক তবে এফএফটি পদ্ধতির তুলনায় অনেক কম যা আমার অ্যাপ্লিকেশনটিতে কার্যকর হওয়ার জন্য একটি মিথ্যা ইতিবাচক হারের উচ্চতর হতে হয়।


একটি চিত্র অস্পষ্ট বলে বলতে কি থ্রেশহোল্ড মান হতে পারে? আমি এটি পরীক্ষা করেছি। তবে এর কিছু ভিন্ন ফলাফল দেখাচ্ছে। থ্রেশহোল্ড সেট করতে দয়া করে আমাকে এটিতে সহায়তা করতে পারেন?
2vision2

আপনার পরামর্শটিও চেষ্টা করে দেখুন, তবে আমি যে নম্বর পেয়েছি তা কিছুটা এলোমেলো। আমি যদি এই নির্দিষ্ট বাস্তবায়নের বিষয়ে একটি নতুন প্রশ্ন শুরু করি, আপনি কি একবার নজর দেবেন? \
স্টেপএন

@stpn ডান দিকের প্রান্তটি দৃশ্য নির্ভর। আমার অ্যাপ্লিকেশনটিতে (সিসিটিভি) আমি একটি ডিফল্ট প্রান্তিক 300 ব্যবহার করছি cameras ক্যামেরাগুলি যেখানে সমর্থন থেকে কাউকে কমিয়ে দেয় সেই নির্দিষ্ট ক্যামেরার জন্য কনফিগার করা মান পরিবর্তন করবে।
ইয়াউর

কেন "ম্যাক্সল্যাপ = -32767;" ?
ক্লিমেন্ট প্রেম

আমরা সর্বাধিক বৈপরীত্যের সন্ধান করছি এবং যেহেতু আমরা স্বাক্ষরিত শর্টস দিয়ে কাজ করছি -32767 সর্বনিম্ন সম্ভাব্য মান। আমি এই কোডটি লিখেছি তার 2.5 বছর হয়ে গেছে তবে আইআইআরসি আমার 16 ইউ ব্যবহার করে সমস্যা করেছে।
ইয়াহুর

23

আমি সম্পূর্ণ ভিন্ন সমাধান নিয়ে এসেছি। প্রতিটি (এক্স) ফ্রেমের মধ্যে তীক্ষ্ণতম সন্ধান করতে আমার এখনও ভিডিও ফ্রেম বিশ্লেষণ করতে হবে। এইভাবে, আমি গতি ঝাপসা এবং / অথবা ফোকাস চিত্রগুলির বাইরে সনাক্ত করব।

আমি ক্যানি এজ সনাক্তকরণটি ব্যবহার করে শেষ করেছি এবং আমি প্রায় প্রতিটি ধরণের ভিডিওর সাথে খুব ভাল ফলাফল পেয়েছি (নিকির পদ্ধতিতে, আমার ডিজিটালাইজড ভিএইচএস ভিডিও এবং ভারী ইন্টারলেসড ভিডিও সহ সমস্যা ছিল)।

আমি মূল চিত্রটিতে আগ্রহের অঞ্চল (আরওআই) সেট করে পারফরম্যান্সটি অনুকূল করে তুলেছি।

EmguCV ব্যবহার:

//Convert image using Canny
using (Image<Gray, byte> imgCanny = imgOrig.Canny(225, 175))
{
    //Count the number of pixel representing an edge
    int nCountCanny = imgCanny.CountNonzero()[0];

    //Compute a sharpness grade:
    //< 1.5 = blurred, in movement
    //de 1.5 à 6 = acceptable
    //> 6 =stable, sharp
    double dSharpness = (nCountCanny * 1000.0 / (imgCanny.Cols * imgCanny.Rows));
}

17

সেই দুর্দান্ত ল্যাপ্লেস পরামর্শের জন্য নিকি ধন্যবাদ। ওপেনসিভি ডক্স আমাকে একই দিক নির্দেশ করেছে: পাইথন, সিভি 2 (ওপেনসিভি 2.4.10) এবং অদ্ভুত ব্যবহার করে ...

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) numpy.max(cv2.convertScaleAbs(cv2.Laplacian(gray_image,3)))

ফলাফল 0-255 এর মধ্যে। আমি 200ish এরও বেশি কিছু খুঁজে পেয়েছি খুব ফোকাসে এবং 100 এর দ্বারা এটি লক্ষণীয়ভাবে অস্পষ্ট। পুরোপুরি অস্পষ্ট হওয়া সত্ত্বেও সর্বোচ্চ 20 বছরের নিচে আসলেই বেশি কিছু পায় না।


3
আমি আমার 3 টি ছবির জন্য 255 পেয়েছি। এবং একটি পুরোপুরি কেন্দ্রীভূত ছবির জন্য আমি 108 পেয়েছি So সুতরাং, আমি মনে করি পদ্ধতির কার্যকারিতা কোনও কিছুর উপর নির্ভর করে।
উইন্ডারাইডার

@ উইন্ডওয়াইডারের সাথে একমত নমুনা চিত্র যেখানে এই ব্যর্থ হয় এই চিত্রটি আমি মনে করি এর কারণটি হ'ল চিত্রটি নড়বড়ে হলেও চিত্রের বৈপরীত্য এবং পিক্সেলের মধ্যে তীব্রতার সাথে তাত্পর্যপূর্ণ বৃহত্তর, যার কারণে ল্যাপ্লেসিয়ার মানগুলি তুলনামূলকভাবে বড়। আমি ভুল হলে আমাকে সংশোধন করুন।
রেশম ওয়াধওয়া

@ রেশমওয়াদওয়াহা সিসি উইন্ডারাইডার - এটি - কীভাবে এটি ঠিক করবেন সে সম্পর্কে কোনও ধারণা ??
jtlz2

@ ggez44 এটি আমার পছন্দসই উত্তর - তবে মানটি চিত্রটিতে পিক্সেলের সংখ্যার ফাংশন। আপনি কি জানেন কীভাবে এটি তাত্ত্বিকভাবে দাঁড়িপাল্লা করে? আমি এটিকে একটি নতুন প্রশ্ন হিসাবে জিজ্ঞাসা করতে পারি তবে সম্ভবত এটি নষ্ট হয়ে যায়। ধন্যবাদ!
jtlz2

10

একটি উপায় যা বর্তমানে আমি ব্যবহার করছি তা ইমেজের প্রান্তগুলির বিস্তারকে পরিমাপ করে। এই কাগজটি দেখুন:

@ARTICLE{Marziliano04perceptualblur,
    author = {Pina Marziliano and Frederic Dufaux and Stefan Winkler and Touradj Ebrahimi},
    title = {Perceptual blur and ringing metrics: Application to JPEG2000,” Signal Process},
    journal = {Image Commun},
    year = {2004},
    pages = {163--172} }

এটি সাধারণত পে-ওয়াল এর পিছনে থাকে তবে আমি চারপাশে কয়েকটি বিনামূল্যে কপি দেখেছি। মূলত, তারা একটি চিত্রের মধ্যে উল্লম্ব প্রান্তগুলি সনাক্ত করে এবং তারপরে প্রান্তগুলি কত প্রশস্ত তা পরিমাপ করে। প্রস্থের গড় চিত্র চিত্রের জন্য চূড়ান্ত অস্পষ্টতা অনুমানের ফলাফল দেয়। বিস্তৃত প্রান্তগুলি অস্পষ্ট চিত্রগুলির সাথে মিলে যায় এবং তদ্বিপরীত হয়।

এই সমস্যাটি কোনও রেফারেন্স চিত্রের গুণমান অনুমানের ক্ষেত্রের অন্তর্গত । যদি আপনি এটি গুগল স্কলারে সন্ধান করেন তবে আপনি প্রচুর দরকারী রেফারেন্স পাবেন।

সম্পাদনা

নিকারির পোস্টে 5 টি চিত্রের জন্য প্রাপ্ত অস্পষ্ট অনুমানের একটি প্লট এখানে। উচ্চতর মান বৃহত্তর অস্পষ্টতার সাথে মিলে যায়। আমি একটি স্থির-আকারের 11x11 গাউসিয়ান ফিল্টার ব্যবহার করেছি এবং মানক বিচ্যুতিটি (বৈচিত্রপূর্ণ convertচিত্রগুলি পেতে ইমেজম্যাগিকের আদেশটি ব্যবহার করে) বৈচিত্রপূর্ণ ।

এখানে চিত্র বর্ণনা লিখুন

আপনি যদি বিভিন্ন আকারের চিত্রের তুলনা করেন তবে চিত্রের প্রস্থের দ্বারা স্বাভাবিককরণ করতে ভুলবেন না, কারণ বৃহত্তর চিত্রগুলির আরও প্রান্ত রয়েছে।

পরিশেষে, একটি উল্লেখযোগ্য সমস্যা শৈল্পিক অস্পষ্টতা এবং অনাকাঙ্ক্ষিত অস্পষ্টতা (ফোকাস মিস, সংক্ষেপণ, ক্যামেরার সাথে সম্পর্কিত সম্পর্কিত গতি দ্বারা সৃষ্ট) এর মধ্যে পার্থক্য করা তবে এটি এর মতো সহজ পদ্ধতির বাইরে। শৈল্পিক অস্পষ্টতার উদাহরণের জন্য, লেনার চিত্রটি দেখুন: আয়নায় লেনার প্রতিচ্ছবি অস্পষ্ট, তবে তার চেহারা পুরোপুরি ফোকাসে। এটি লেনা চিত্রটির জন্য উচ্চতর অস্পষ্টতা অনুমানকে অবদান রাখে।


5

আমি এই পোস্ট থেকে ল্যাপ্লেসিয়ান ফিল্টার ভিত্তিক সমাধান চেষ্টা করেছি । এটি আমাকে সাহায্য করেনি। সুতরাং, আমি এই পোস্ট থেকে সমাধানটি চেষ্টা করেছিলাম এবং এটি আমার ক্ষেত্রে ভাল (তবে ধীর):

import cv2

image = cv2.imread("test.jpeg")
height, width = image.shape[:2]
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

def px(x, y):
    return int(gray[y, x])

sum = 0
for x in range(width-1):
    for y in range(height):
        sum += abs(px(x, y) - px(x+1, y))

কম অস্পষ্ট চিত্রটির সর্বাধিক sumমান রয়েছে!

পদক্ষেপ পরিবর্তন করে আপনি গতি এবং নির্ভুলতার সাথে সুরও করতে পারেন, যেমন

এই অংশ

for x in range(width - 1):

আপনি এই এক সঙ্গে প্রতিস্থাপন করতে পারেন

for x in range(0, width - 1, 10):

4

উপরোক্ত উত্তরগুলি বেশ কয়েকটি বিষয় ব্যাখ্যা করেছে তবে আমি ধারণা করি যে এটি একটি ধারণাগত পার্থক্য তৈরি করা কার্যকর।

আপনি যদি কোনও অস্পষ্ট চিত্রটির পুরোপুরি মনোযোগ কেন্দ্রীভূত চিত্রটি নেন?

অস্পষ্ট সনাক্তকরণের সমস্যাটি তখনই ভালভাবে ডাকা হয় যখন আপনার কোনও রেফারেন্স থাকে । যদি আপনাকে ডিজাইনের প্রয়োজন হয়, যেমন, একটি অটো-ফোকাস সিস্টেম, আপনি বিভিন্ন ডিগ্রি ঝাপসা বা স্মুথিংয়ের সাথে তোলা চিত্রগুলির একটি ক্রম তুলনা করেন এবং আপনি এই সেটটির মধ্যে ন্যূনতম ঝাপসা বিন্দুটি সন্ধান করার চেষ্টা করছেন। আমি অন্য কথায় আপনাকে উপরে চিত্রিত একটি কৌশল ব্যবহার করে বিভিন্ন চিত্রের রেফারেন্সের প্রয়োজন (মূলত - পদ্ধতির মধ্যে বিভিন্ন সম্ভাব্য স্তরের পরিশোধন - সর্বাধিক উচ্চ-ফ্রিকোয়েন্সি সামগ্রী সহ একটি চিত্র অনুসন্ধান করা)।


2
অন্য কথায় এটি একটি আপেক্ষিক ধারণা, কোনও চিত্র অন্য অনুরূপ চিত্রের চেয়ে কম বা কম অস্পষ্ট কিনা তা কেবল জানা সম্ভব। অর্থাত্ যদি এর এফএফটিতে কম-বেশি উচ্চ ফ্রিকোয়েন্সি সামগ্রী থাকে। বিশেষ ক্ষেত্রে: সর্বাধিক এবং সর্বনিম্ন আলোকিততার সাথে যদি চিত্রটির সংলগ্ন পিক্সেল থাকে? উদাহরণস্বরূপ সম্পূর্ণ সাদা পিক্সেলের পাশে একটি সম্পূর্ণ কালো পিক্সেল। এই ক্ষেত্রে এটি একটি নিখুঁত ফোকাস, অন্যথায় কালো থেকে সাদা থেকে মসৃণ রূপান্তর হবে। নিখুঁত ফোকাস ফটোগ্রাফি না সম্ভবত, কিন্তু প্রশ্ন ইমেজ উত্স নির্দিষ্ট করে না (এটি কম্পিউটার উত্পাদিত হতে পারে)।
বেন

1

অত্যন্ত সম্মানিত জার্নালগুলিতে প্রকাশিত হয়েছে এমন দুটি পদ্ধতির ম্যাটলব কোড (চিত্র প্রক্রিয়াকরণ সম্পর্কিত আইইইই লেনদেন) এখানে উপলভ্য: https://ivulab.asu.edu/software

সিপিবিডিএম এবং জেএনবিএম আলগোরিদিমগুলি পরীক্ষা করে দেখুন। আপনি যদি কোডটি পরীক্ষা করেন তবে পোর্ট করা খুব কঠিন নয় এবং ঘটনাক্রমে এটি মারজিয়ালিয়ানো পদ্ধতির উপর ভিত্তি করে মৌলিক বৈশিষ্ট্য হিসাবে রয়েছে।


1

আমি মাতলাব এ এটি ফিট ব্যবহার করেছি এবং ফিটের গণনার গড় এবং স্টাডির হিস্টোগ্রাম পরীক্ষা করেছি তবে ফিট ফাংশনও করা যেতে পারে

fa =  abs(fftshift(fft(sharp_img)));
fb = abs(fftshift(fft(blured_img)));

f1=20*log10(0.001+fa);
f2=20*log10(0.001+fb);

figure,imagesc(f1);title('org')
figure,imagesc(f2);title('blur')

figure,hist(f1(:),100);title('org')
figure,hist(f2(:),100);title('blur')

mf1=mean(f1(:));
mf2=mean(f2(:));

mfd1=median(f1(:));
mfd2=median(f2(:));

sf1=std(f1(:));
sf2=std(f2(:));

1

কোনও অঞ্চলে ফোকাসের মান সনাক্ত করতে আমি ওপেনসিভিতে এটি করি:

Mat grad;
int scale = 1;
int delta = 0;
int ddepth = CV_8U;
Mat grad_x, grad_y;
Mat abs_grad_x, abs_grad_y;
/// Gradient X
Sobel(matFromSensor, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_DEFAULT);
/// Gradient Y
Sobel(matFromSensor, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_DEFAULT);
convertScaleAbs(grad_x, abs_grad_x);
convertScaleAbs(grad_y, abs_grad_y);
addWeighted(abs_grad_x, 0.5, abs_grad_y, 0.5, 0, grad);
cv::Scalar mu, sigma;
cv::meanStdDev(grad, /* mean */ mu, /*stdev*/ sigma);
focusMeasure = mu.val[0] * mu.val[0];
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.