How can i study the symmetry in color with matlab?
2 次查看(过去 30 天)
显示 更早的评论
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
回答(1 个)
Image Analyst
2012-11-8
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 个评论
Tomas
2012-11-8
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
2012-11-8
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
2012-11-8
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
2012-11-9
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
2012-11-9
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
2012-11-9
编辑:Tomas
2012-11-9
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
2012-11-13
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
2012-11-13
I want to find the score of asymmetry in color so I don't know what should I use rgb or hsv
Pamela
2012-11-15
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
2012-11-19
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
2012-11-19
编辑:Pamela
2012-11-20
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
2013-6-19
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
2014-11-22
Hey I am also working on asymmetry of images Can anybody explain me the method how to implement this in Matlab?
Image Analyst
2014-11-22
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
2014-11-22
I haven't ssim() function in MATLAB 2013. Can you tell me some other method to implement this in Matlab
Image Analyst
2014-11-22
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
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!发生错误
由于页面发生更改,无法完成操作。请重新加载页面以查看其更新后的状态。
您也可以从以下列表中选择网站:
如何获得最佳网站性能
选择中国网站(中文或英文)以获得最佳网站性能。其他 MathWorks 国家/地区网站并未针对您所在位置的访问进行优化。
美洲
- América Latina (Español)
- Canada (English)
- United States (English)
欧洲
- 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)
亚太
- Australia (English)
- India (English)
- New Zealand (English)
- 中国
- 日本Japanese (日本語)
- 한국Korean (한국어)