আমি ভাবছিলাম যে কোনও চিত্রটি অস্পষ্ট কিনা তা নির্ধারণ করার কোনও উপায় আছে কিনা তা চিত্রের বিশ্লেষণের মাধ্যমে বিশ্লেষণ করে দেখছিলাম।
আমি ভাবছিলাম যে কোনও চিত্রটি অস্পষ্ট কিনা তা নির্ধারণ করার কোনও উপায় আছে কিনা তা চিত্রের বিশ্লেষণের মাধ্যমে বিশ্লেষণ করে দেখছিলাম।
উত্তর:
হ্যাঁ, তাই দ্রুত ফুরিয়ার রূপান্তর গণনা করুন এবং ফলাফলটি বিশ্লেষণ করুন। ফুরিয়ার রূপান্তর আপনাকে জানায় যে চিত্রটিতে কোন ফ্রিকোয়েন্সি উপস্থিত রয়েছে। যদি কম পরিমাণে উচ্চ ফ্রিকোয়েন্সি থাকে তবে চিত্রটি অস্পষ্ট।
'নিম্ন' এবং 'উচ্চ' পদগুলির সংজ্ঞা দেওয়া আপনার হাতে to
সম্পাদনা করুন :
মন্তব্যে যেমন বলা হয়েছে, আপনি যদি কোনও প্রদত্ত চিত্রের অস্পষ্টতা উপস্থাপন করে এমন একক ফ্লোট চান, তবে আপনাকে উপযুক্ত মেট্রিকের কাজ করতে হবে।
নিকির উত্তর যেমন একটি মেট্রিক সরবরাহ করে। একটি ল্যাপ্লেসিয়ান কার্নেল দিয়ে চিত্রটি রূপান্তর করুন:
1
1 -4 1
1
এবং আউটপুটে একটি শক্তিশালী সর্বাধিক মেট্রিক ব্যবহার করুন যা আপনি থ্রেশোল্ডিংয়ের জন্য ব্যবহার করতে পারেন। Laplacian গণনা করার আগে খুব বেশি ইমেজ স্মুথ এড়ানোর চেষ্টা করুন, কারণ আপনি কেবল জানতে পারবেন যে একটি স্মুথড চিত্রটি আসলেই অস্পষ্ট :-)।
কোনও চিত্রের তীক্ষ্ণতা অনুমান করার আরেকটি খুব সহজ উপায় হ'ল ল্যাপ্লেস (বা এলওজি) ফিল্টারটি ব্যবহার করা এবং সর্বাধিক মান বাছাই করা। আপনি যদি শব্দটি আশা করেন তবে 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}]
লগারিদমিক প্লটের ফলাফল:
5 টি লাইন 5 টি পরীক্ষা চিত্রের প্রতিনিধিত্ব করে, এক্স অক্ষটি গাউসিয়ান ফিল্টার ব্যাসার্ধকে উপস্থাপন করে। গ্রাফগুলি হ্রাস পাচ্ছে, তাই এফএফটি তীক্ষ্ণতার জন্য একটি ভাল পরিমাপ।
এটি "সর্বোচ্চ লোজি" অস্পষ্টতা অনুমানের কোড: এটি কেবল একটি এলওজি ফিল্টার প্রয়োগ করে এবং ফিল্টারের ফলাফলের মধ্যে সবচেয়ে উজ্জ্বল পিক্সেল দেয়:
testLaplacian[img_] := Table[
(
blurred = GaussianFilter[img, r];
Max[Flatten[ImageData[LaplacianGaussianFilter[blurred, 1]]]];
), {r, 0, 10, 0.5}]
লগারিদমিক প্লটের ফলাফল:
অ-অস্পষ্ট চিত্রগুলির জন্য স্প্রেটি এখানে কিছুটা ভাল (2.5 বনাম 3.3), মূলত কারণ এই পদ্ধতিটি কেবল চিত্রের সবচেয়ে শক্তিশালী বৈপরীত্য ব্যবহার করে, যখন এফএফটি মূলত পুরো চিত্রের উপর নির্ভর করে। ফাংশনগুলিও দ্রুত হ্রাস পাচ্ছে, সুতরাং "ঝাপসা" থ্রেশহোল্ড সেট করা আরও সহজ হতে পারে।
একটি অটো ফোকাস লেন্স দিয়ে কিছু কাজের সময়, আমি চিত্র ফোকাস সনাক্তকরণের জন্য অ্যালগরিদমের এই খুব দরকারী সেটটি পেলাম । এটি ম্যাটল্যাবে প্রয়োগ করা হয়েছে, তবে বেশিরভাগ কার্যকারিতা ওপেনসিভিতে ফিল্টার 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;
}
এই ব্যবস্থাগুলি আপনার সমস্যার জন্য সেরা পছন্দ কিনা তা নিয়ে কোনও গ্যারান্টি নেই তবে আপনি যদি এই ব্যবস্থাগুলির সাথে যুক্ত কাগজগুলি সন্ধান করেন তবে সেগুলি আপনাকে আরও অন্তর্দৃষ্টি দিতে পারে। আপনি কোড দরকারী খুঁজে পেতে আশা করি! আমি জানি আমি করেছি।
নাইকের উত্তর বন্ধ করে দেওয়া। ওপেনসিভি দিয়ে ল্যালাপাসিয়ান ভিত্তিক পদ্ধতিটি বাস্তবায়নের জন্য এটি সোজা:
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;
}
সনাক্ত করা সর্বাধিক তীক্ষ্ণতা নির্দেশ করে একটি সংক্ষিপ্ত ফিরিয়ে দেবে, যা বাস্তব বিশ্বের নমুনাগুলিতে আমার পরীক্ষার উপর ভিত্তি করে ক্যামেরা ফোকাসে আছে বা না থাকলে এটির একটি দুর্দান্ত সূচক। আশ্চর্যের বিষয় নয়, স্বাভাবিক মানগুলি দৃশভিত্তিক তবে এফএফটি পদ্ধতির তুলনায় অনেক কম যা আমার অ্যাপ্লিকেশনটিতে কার্যকর হওয়ার জন্য একটি মিথ্যা ইতিবাচক হারের উচ্চতর হতে হয়।
আমি সম্পূর্ণ ভিন্ন সমাধান নিয়ে এসেছি। প্রতিটি (এক্স) ফ্রেমের মধ্যে তীক্ষ্ণতম সন্ধান করতে আমার এখনও ভিডিও ফ্রেম বিশ্লেষণ করতে হবে। এইভাবে, আমি গতি ঝাপসা এবং / অথবা ফোকাস চিত্রগুলির বাইরে সনাক্ত করব।
আমি ক্যানি এজ সনাক্তকরণটি ব্যবহার করে শেষ করেছি এবং আমি প্রায় প্রতিটি ধরণের ভিডিওর সাথে খুব ভাল ফলাফল পেয়েছি (নিকির পদ্ধতিতে, আমার ডিজিটালাইজড ভিএইচএস ভিডিও এবং ভারী ইন্টারলেসড ভিডিও সহ সমস্যা ছিল)।
আমি মূল চিত্রটিতে আগ্রহের অঞ্চল (আরওআই) সেট করে পারফরম্যান্সটি অনুকূল করে তুলেছি।
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));
}
সেই দুর্দান্ত ল্যাপ্লেস পরামর্শের জন্য নিকি ধন্যবাদ। ওপেনসিভি ডক্স আমাকে একই দিক নির্দেশ করেছে: পাইথন, সিভি 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 বছরের নিচে আসলেই বেশি কিছু পায় না।
একটি উপায় যা বর্তমানে আমি ব্যবহার করছি তা ইমেজের প্রান্তগুলির বিস্তারকে পরিমাপ করে। এই কাগজটি দেখুন:
@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
চিত্রগুলি পেতে ইমেজম্যাগিকের আদেশটি ব্যবহার করে) বৈচিত্রপূর্ণ ।
আপনি যদি বিভিন্ন আকারের চিত্রের তুলনা করেন তবে চিত্রের প্রস্থের দ্বারা স্বাভাবিককরণ করতে ভুলবেন না, কারণ বৃহত্তর চিত্রগুলির আরও প্রান্ত রয়েছে।
পরিশেষে, একটি উল্লেখযোগ্য সমস্যা শৈল্পিক অস্পষ্টতা এবং অনাকাঙ্ক্ষিত অস্পষ্টতা (ফোকাস মিস, সংক্ষেপণ, ক্যামেরার সাথে সম্পর্কিত সম্পর্কিত গতি দ্বারা সৃষ্ট) এর মধ্যে পার্থক্য করা তবে এটি এর মতো সহজ পদ্ধতির বাইরে। শৈল্পিক অস্পষ্টতার উদাহরণের জন্য, লেনার চিত্রটি দেখুন: আয়নায় লেনার প্রতিচ্ছবি অস্পষ্ট, তবে তার চেহারা পুরোপুরি ফোকাসে। এটি লেনা চিত্রটির জন্য উচ্চতর অস্পষ্টতা অনুমানকে অবদান রাখে।
আমি এই পোস্ট থেকে ল্যাপ্লেসিয়ান ফিল্টার ভিত্তিক সমাধান চেষ্টা করেছি । এটি আমাকে সাহায্য করেনি। সুতরাং, আমি এই পোস্ট থেকে সমাধানটি চেষ্টা করেছিলাম এবং এটি আমার ক্ষেত্রে ভাল (তবে ধীর):
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):
উপরোক্ত উত্তরগুলি বেশ কয়েকটি বিষয় ব্যাখ্যা করেছে তবে আমি ধারণা করি যে এটি একটি ধারণাগত পার্থক্য তৈরি করা কার্যকর।
আপনি যদি কোনও অস্পষ্ট চিত্রটির পুরোপুরি মনোযোগ কেন্দ্রীভূত চিত্রটি নেন?
অস্পষ্ট সনাক্তকরণের সমস্যাটি তখনই ভালভাবে ডাকা হয় যখন আপনার কোনও রেফারেন্স থাকে । যদি আপনাকে ডিজাইনের প্রয়োজন হয়, যেমন, একটি অটো-ফোকাস সিস্টেম, আপনি বিভিন্ন ডিগ্রি ঝাপসা বা স্মুথিংয়ের সাথে তোলা চিত্রগুলির একটি ক্রম তুলনা করেন এবং আপনি এই সেটটির মধ্যে ন্যূনতম ঝাপসা বিন্দুটি সন্ধান করার চেষ্টা করছেন। আমি অন্য কথায় আপনাকে উপরে চিত্রিত একটি কৌশল ব্যবহার করে বিভিন্ন চিত্রের রেফারেন্সের প্রয়োজন (মূলত - পদ্ধতির মধ্যে বিভিন্ন সম্ভাব্য স্তরের পরিশোধন - সর্বাধিক উচ্চ-ফ্রিকোয়েন্সি সামগ্রী সহ একটি চিত্র অনুসন্ধান করা)।
অত্যন্ত সম্মানিত জার্নালগুলিতে প্রকাশিত হয়েছে এমন দুটি পদ্ধতির ম্যাটলব কোড (চিত্র প্রক্রিয়াকরণ সম্পর্কিত আইইইই লেনদেন) এখানে উপলভ্য: https://ivulab.asu.edu/software
সিপিবিডিএম এবং জেএনবিএম আলগোরিদিমগুলি পরীক্ষা করে দেখুন। আপনি যদি কোডটি পরীক্ষা করেন তবে পোর্ট করা খুব কঠিন নয় এবং ঘটনাক্রমে এটি মারজিয়ালিয়ানো পদ্ধতির উপর ভিত্তি করে মৌলিক বৈশিষ্ট্য হিসাবে রয়েছে।
আমি মাতলাব এ এটি ফিট ব্যবহার করেছি এবং ফিটের গণনার গড় এবং স্টাডির হিস্টোগ্রাম পরীক্ষা করেছি তবে ফিট ফাংশনও করা যেতে পারে
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(:));
কোনও অঞ্চলে ফোকাসের মান সনাক্ত করতে আমি ওপেনসিভিতে এটি করি:
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];