من رفتم سربازی اگر محتوای منو دوست داشتید و بدردتون خورد از من حمایت مالی کنید

کار با correlation در متلب

کار با correlation در متلب
کار با correlation در متلب

کار با correlation در متلب

در این نوشته به کمک correlation از بین یک جمع چهره‌ی فرد تشخیص داده می‌شود البته دقت کنید ممکن است کمی خطا داشته باشد یا با تصاویر مختلف به مشکل بخورد ولی تا حد زیادی الگوریتم correlation پیاده سازی شده است.

 

کار با correlation در متلب

Filter.jpg

 

filter_ssim.jpg

کد main.m:

clc;
clear all;
close all;

image_ref          = imread('img/image_ref.jpg');
filter             = imread('img/filter.jpg');

image               = image_ref;
filter              = filter;

correlation = normxcorr2(filter(:,:), image(:,:));
figure, imshow(correlation);
title('Correlation image');
    
[maxCorrValue, maxIndex] = max(abs(correlation(:)));
[yPeak, xPeak] = ind2sub(size(correlation), maxIndex(1));

corr_offset = [(xPeak - size(filter, 2)) (yPeak - size(filter, 2))];

if(corr_offset(1) < 0)
   corr_offset(1) = corr_offset(1) * (-1); 
end

if(corr_offset(2) < 0)
   corr_offset(2) = corr_offset(2) * (-1); 
end

axis on;
hold on;
figure, imshow(image);
title('find area');
boxRect = [corr_offset(1) corr_offset(2) 200, 200];
rectangle('position', boxRect, 'edgecolor', 'r', 'linewidth', 2);

کد main2.m:

clc;
close all;
clear all;

image_ref          = imread('img/image_ref.jpg');
filter             = imread('img/filter_ssim.jpg');

image               = image_ref;
filter              = filter;

image_ref_size = size(image_ref);
filter_size = size(filter);
temp_result = 0;
corr2val = 0;
ssim_result = zeros(image_ref_size(1), image_ref_size(2), 'int8');
K = [0.1 0.3];
window = fspecial('gaussian', 10, 2.5);
L = 255;
   
for m = round(filter_size(1) / 2) : image_ref_size(1)
    if(m + filter_size(1) > image_ref_size(1))
    	break; 
    end
	for n = round(filter_size(2) / 2) : image_ref_size(2)
        image_temp = zeros(filter_size(1), filter_size(2));
        if(n + filter_size(2) > image_ref_size(2))
           break; 
        end
        for i = m : m + filter_size(1)
        	for j = n : n + filter_size(2)
            	image_temp(i, j) = image_ref(i, j);
            end
        end
        res = ssim(image_temp, filter, K, window, L);
        if(res < 0)
        	res = res * (-1);
        end
        temp_result = round(res * 255);
        ssim_result(m, n) = int8(temp_result);
    end
end

figure, imshow(ssim_result);
title('find area with ssim');

کد ssim.m:

function res = ssim(image1_filename, image2_filename, K, window, L)

image1 = image1_filename;
image2 = image2_filename;
ssim_map = -Inf;
if (nargin < 2 || nargin > 5)
   res = -Inf;
   ssim_map = -Inf;
   return;
end

if (size(image1) ~= size(image2))
   res = -Inf;
   ssim_map = -Inf;
   return;
end

[M N] = size(image1);

if (nargin == 2)
   if ((M < 11) || (N < 11))
	   res = -Inf;
	   ssim_map = -Inf;
      return
   end
   window = fspecial('gaussian', 11, 1.5);
   K(1) = 0.01;
   K(2) = 0.03;
   L = 255;
end

if (nargin == 3)
   if ((M < 11) || (N < 11))
	   res = -Inf;
	   ssim_map = -Inf;
      return
   end
   window = fspecial('gaussian', 11, 1.5);
   L = 255;
   if (length(K) == 2)
      if (K(1) < 0 || K(2) < 0)
		   res = -Inf;
   		ssim_map = -Inf;
	   	return;
      end
   else
	   res = -Inf;
   	ssim_map = -Inf;
	   return;
   end
end

if (nargin == 4)
   [H W] = size(window);
   if ((H*W) < 4 || (H > M) || (W > N))
	   res = -Inf;
	   ssim_map = -Inf;
      return
   end
   L = 255;
   if (length(K) == 2)
      if (K(1) < 0 || K(2) < 0)
		   res = -Inf;
   		ssim_map = -Inf;
	   	return;
      end
   else
	   res = -Inf;
   	ssim_map = -Inf;
	   return;
   end
end

if (nargin == 5)
   [H W] = size(window);
   if ((H*W) < 4 || (H > M) || (W > N))
	   res = -Inf;
	   ssim_map = -Inf;
      return
   end
   if (length(K) == 2)
      if (K(1) < 0 || K(2) < 0)
		   res = -Inf;
   		ssim_map = -Inf;
	   	return;
      end
   else
	   res = -Inf;
   	ssim_map = -Inf;
	   return;
   end
end


image1 = double(image1);
image2 = double(image2);
f = max(1,round(min(M,N)/256));
if(f>1)
    lpf = ones(f,f);
    lpf = lpf/sum(lpf(:));
    image1 = imfilter(image1,lpf,'symmetric','same');
    image2 = imfilter(image2,lpf,'symmetric','same');

    image1 = image1(1:f:end,1:f:end);
    image2 = image2(1:f:end,1:f:end);
end

C1 = (K(1)*L)^2;
C2 = (K(2)*L)^2;
window = window/sum(sum(window));

mu1   = filter2(window, image1, 'valid');
mu2   = filter2(window, image2, 'valid');
mu1_sq = mu1.*mu1;
mu2_sq = mu2.*mu2;
mu1_mu2 = mu1.*mu2;
sigma1_sq = filter2(window, image1.*image1, 'valid') - mu1_sq;
sigma2_sq = filter2(window, image2.*image2, 'valid') - mu2_sq;
sigma12 = filter2(window, image1.*image2, 'valid') - mu1_mu2;

if (C1 > 0 && C2 > 0)
   ssim_map = ((2*mu1_mu2 + C1).*(2*sigma12 + C2))./((mu1_sq + mu2_sq + C1).*(sigma1_sq + sigma2_sq + C2));
else
   numerator1 = 2*mu1_mu2 + C1;
   numerator2 = 2*sigma12 + C2;
	denominator1 = mu1_sq + mu2_sq + C1;
   denominator2 = sigma1_sq + sigma2_sq + C2;
   ssim_map = ones(size(mu1));
   index = (denominator1.*denominator2 > 0);
   ssim_map(index) = (numerator1(index).*numerator2(index))./(denominator1(index).*denominator2(index));
   index = (denominator1 ~= 0) & (denominator2 == 0);
   ssim_map(index) = numerator1(index)./denominator1(index);
end

res = mean2(ssim_map);

return

 

روش‌های انجام Correlation

  • بخش اول در فایل m انجام می‌شود.
  • بدست آوردن correlation با تابع corr2 متلب انجام شده است.
  • خروجی به صورت یک تصویر سیاهی و سفیدی است که مکان‌هایی که شباهت دارند روشن‌تر هستند.
  • خروجی دوم در عکس اصلی است که مکانی که شباهت بیش‌تری داشته را انتخاب کرده است.
  • بخش دوم در فایل m است.
  • تابع مورد استفاده برای ssim که در این تمرین استفاده شده است در تمرین‌های قبلی انجام شده است.
  • در بخش دوم تمرین یک حلقه‌ی تو در تو با در نظر گرفتن padding داریم که هر بار یک قسمت از عکس اصلی به اندازه‌ی فیلتر را می‌برد و مقدار ssim آن را محاسبه می‌کنیم.
  • نتایج ssim را در یک ماتریس خروجی ذخیره می‌کنیم و در نهایت آن را نمایش می‌دهیم.

 

خروجی

خروجی 1

خروجی 2

برای مطالعه‌ی محتوای بیش‌تر در ارتباط با متلب روی این لینک کلیک کنید. نظرات خود را برای ما بنویسید.

برای امتیاز به این نوشته کلیک کنید!
[کل: 0 میانگین: 0]