You are now following this question
- You will see updates in your followed content feed.
- You may receive emails, depending on your communication preferences.
How can i study the symmetry in color with matlab?
    2 views (last 30 days)
  
       Show older comments
    
Hello,
how can I decide that an image is symmetric or asymmetric in color after dividing it into two parts vertically (the right part and the left part)? thanks
Answers (1)
  Image Analyst
      
      
 on 8 Nov 2012
        You could chop the image in half, call fliplr() to flip one of the halves, then check similarity with SSIM (See wikipedia) or something similar like PSNR.
19 Comments
  Tomas
 on 8 Nov 2012
				I used fliplr() but i get this error
??? Error using ==> fliplr at 18
X must be a 2-D matrix.
Error in ==> code at 40
B = fliplr(A);
  Image Analyst
      
      
 on 8 Nov 2012
				Then you have to extract each color channel
% Extract the individual red, green, and blue color channels.
redChannel = rgbImage(:, :, 1);
greenChannel = rgbImage(:, :, 2);
blueChannel = rgbImage(:, :, 3);
and flip them one at a time, then recombine:
rgbImage = cat(3, redChannel, greenChannel, blueChannel);
  Tomas
 on 8 Nov 2012
				I used this function of SSIM
function [mssim, ssim_map] = ssim_index(img1, img2, K, window, L)
if (nargin < 2 || nargin > 5)
   ssim_index = -Inf;
   ssim_map = -Inf;
   return;
end
if (size(img1) ~= size(img2))
   ssim_index = -Inf;
   ssim_map = -Inf;
   return;
end
[M N] = size(img1);
if (nargin == 2)
   if ((M < 11) || (N < 11))
     ssim_index = -Inf;
     ssim_map = -Inf;
      return
   end
   %window = fspecial('gaussian', 11, 1.5);  %
  % K(1) = 0.01;                      % default settings
  % K(2) = 0.03;                      %
  % L = 255;                                  %
end
if (nargin == 3)
   if ((M < 11) || (N < 11))
     ssim_index = -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)
       ssim_index = -Inf;
       ssim_map = -Inf;
       return;
      end
   else
     ssim_index = -Inf;
     ssim_map = -Inf;
     return;
   end
end
if (nargin == 4)
   [H W] = size(window);
   if ((H*W) < 4 || (H > M) || (W > N))
     ssim_index = -Inf;
     ssim_map = -Inf;
      return
   end
   L = 255;
   if (length(K) == 2)
      if (K(1) < 0 || K(2) < 0)
       ssim_index = -Inf;
       ssim_map = -Inf;
       return;
      end
   else
     ssim_index = -Inf;
     ssim_map = -Inf;
     return;
   end
end
if (nargin == 5)
   [H W] = size(window);
   if ((H*W) < 4 || (H > M) || (W > N))
     ssim_index = -Inf;
     ssim_map = -Inf;
      return
   end
   if (length(K) == 2)
      if (K(1) < 0 || K(2) < 0)
       ssim_index = -Inf;
       ssim_map = -Inf;
       return;
      end
   else
     ssim_index = -Inf;
     ssim_map = -Inf;
     return;
   end
end
C1 = (K(1)*L)^2;
C2 = (K(2)*L)^2;
window = window/sum(sum(window));
img1 = double(img1);
img2 = double(img2);
mu1   = filter2(window, img1, 'valid');
mu2   = filter2(window, img2, 'valid');
mu1_sq = mu1.*mu1;
mu2_sq = mu2.*mu2;
mu1_mu2 = mu1.*mu2;
sigma1_sq = filter2(window, img1.*img1, 'valid') - mu1_sq;
sigma2_sq = filter2(window, img2.*img2, 'valid') - mu2_sq;
sigma12 = filter2(window, img1.*img2, '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
%figure,imshow(ssim_map);
mssim = mean2(ssim_map);
%figure,imshow(mat2gray(ssim_map))
return
but i get this error
??? Undefined function or method 'conv2' for input arguments of type 'double' and attributes 'full 3d real'.
Error in ==> filter2 at 73
        y = conv2(hcol, hrow, x, shape);
Error in ==> ssim_index at 136
mu1   = filter2(window, img1, 'valid');
Error in ==> ssim at 7
[mssim, ssim_map] = ssim_index(img1, img2, K, window, L)
  Tomas
 on 9 Nov 2012
				if I have understood correctly, the 2 in the function name means CONV2 2D, so I can't apply this operation to a 3D matrix (resulting RGB image). So what is the solution??
  Image Analyst
      
      
 on 9 Nov 2012
				Depends on how you want to define symmetry. Why don't you just convert to grayscale and check it? That should give a pretty good idea of whether it's symmetric or not.
  Tomas
 on 9 Nov 2012
				
      Edited: Tomas
 on 9 Nov 2012
  
			I didn't understand what do you mean by 'how you want to define symmetry'. I just want to calculate the index of asymmetry. The index shows a result of evaluation of image's asymmetry It should be between 0 and 1. symmetric-->0 and asymmetric-->1. I think that converting the image to grayscale will not give the same result???
  Image Analyst
      
      
 on 13 Nov 2012
				You could require it be symmetric for each of the red, green, and blue channels. Or you could require it be symmetric for each of the h, s, and v channels. Or you could define it to be symmetric for only the gray scale version, from rgb2gray(), which should give an image essentially the same as the v channel. Which one of those ways do you want to do it?
  Tomas
 on 13 Nov 2012
				I want to find the score of asymmetry in color so I don't know what should I use rgb or hsv
  Pamela
 on 15 Nov 2012
				Hello
function [mssim, ssim_map] = ssim_index(img1, img2, K, window, L)
if (nargin < 2 || nargin > 5)
   ssim_index = -Inf;
   ssim_map = -Inf;
   return;
end
if (size(img1) ~= size(img2))
   ssim_index = -Inf;
   ssim_map = -Inf;
   return;
end
[M N] = size(img1);
if (nargin == 2)
   if ((M < 11) || (N < 11))
     ssim_index = -Inf;
     ssim_map = -Inf;
      return
   end
   %window = fspecial('gaussian', 11, 1.5);  %
  % K(1) = 0.01;                      % default settings
  % K(2) = 0.03;                      %
  % L = 255;                                  %
end
if (nargin == 3)
   if ((M < 11) || (N < 11))
     ssim_index = -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)
       ssim_index = -Inf;
       ssim_map = -Inf;
       return;
      end
   else
     ssim_index = -Inf;
     ssim_map = -Inf;
     return;
   end
end
if (nargin == 4)
   [H W] = size(window);
   if ((H*W) < 4 || (H > M) || (W > N))
     ssim_index = -Inf;
     ssim_map = -Inf;
      return
   end
   L = 255;
   if (length(K) == 2)
      if (K(1) < 0 || K(2) < 0)
       ssim_index = -Inf;
       ssim_map = -Inf;
       return;
      end
   else
     ssim_index = -Inf;
     ssim_map = -Inf;
     return;
   end
end
if (nargin == 5)
   [H W] = size(window);
   if ((H*W) < 4 || (H > M) || (W > N))
     ssim_index = -Inf;
     ssim_map = -Inf;
      return
   end
   if (length(K) == 2)
      if (K(1) < 0 || K(2) < 0)
       ssim_index = -Inf;
       ssim_map = -Inf;
       return;
      end
   else
     ssim_index = -Inf;
     ssim_map = -Inf;
     return;
   end
end
C1 = (K(1)*L)^2;
C2 = (K(2)*L)^2;
window = window/sum(sum(window));
img1 = double(img1);
img2 = double(img2);
mu1   = filter2(window, img1, 'valid');
mu2   = filter2(window, img2, 'valid');
mu1_sq = mu1.*mu1;
mu2_sq = mu2.*mu2;
mu1_mu2 = mu1.*mu2;
sigma1_sq = filter2(window, img1.*img1, 'valid') - mu1_sq;
sigma2_sq = filter2(window, img2.*img2, 'valid') - mu2_sq;
sigma12 = filter2(window, img1.*img2, '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
%figure,imshow(ssim_map);
mssim = mean2(ssim_map);
%figure,imshow(mat2gray(ssim_map))
return
This method can help me to measure the asymmetry index of a color region of interest?? knowing that the background is black. I have now two images, after dividing the segmented image, each containing a portion of the region although divided along the major axis. So how can I adapt this method to my need??
thanks
  Image Analyst
      
      
 on 19 Nov 2012
				Where did you post examples of your symmetric and non-symmetric images?
  Image Analyst
      
      
 on 19 Nov 2012
				It's a lot easier to just get the solidity. Will that work for you? For the two example you gave, solidity would work well for distinguishing between the two.
  Pamela
 on 19 Nov 2012
				
      Edited: Pamela
 on 20 Nov 2012
  
			I couldn't understand what do you mean by 'solidity'. But I will try to explain again: I want to take for example the first image and measure its score of asymmetry. This score should be between 0 and 1. I'm looking for a method to do this. So I'm asking for ssim if it can helps me.
  Mariam Sheha
 on 19 Jun 2013
				Hey Pamela,
I think you are working through melanoma diagnosis applying (ABCD rule), am working through the same target, where i am trying to calculate asymmetry score in color and texture for a segmented image... did you reach an effective method??!
  Sidra Naeem
 on 22 Nov 2014
				Hey I am also working on asymmetry of images Can anybody explain me the method how to implement this in Matlab?
  Image Analyst
      
      
 on 22 Nov 2014
				There is an ssim() function in the Image Processing Toolbox. Or you cuold look for published articles on it here: http://www.visionbib.com/bibliography/contents.html
  Sidra Naeem
 on 22 Nov 2014
				I haven't ssim() function in MATLAB 2013. Can you tell me some other method to implement this in Matlab
  Image Analyst
      
      
 on 22 Nov 2014
				I did , sort of - did you see the link I gave you? That will have the best methods by people who have studied it intensively. Maybe my guess of SSIM is not even the best way.
If you still want ssim(), upgrade to the latest version of MATLAB, or program it yourself with information from http://en.wikipedia.org/wiki/Structural_similarity
See Also
Tags
Products
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!An Error Occurred
Unable to complete the action because of changes made to the page. Reload the page to see its updated state.
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom(English)
Asia Pacific
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)




