How to create a new image with average color of input image in the segmentation region?
2 次查看(过去 30 天)
显示 更早的评论
I have an image and a segmentation mask. How can I generate a new image with each segmented region containing the average color of that region in the original image?
0 个评论
回答(1 个)
DGM
2024-10-13
There are several ways to approach this. I'm going to assume "color" implies that the image may either be RGB or grayscale.
Consider the example:
% a color image
inpict = imread('triad.png');
imshow(inpict)
% a mask selecting objects in the image
mk = max(inpict,[],3) > 32;
% isolate mask blobs
[L nblobs] = bwlabel(mk);
% compose the output image
outpict = inpict;
for k = 1:nblobs
thismask = L == k;
for c = 1:size(inpict,3)
thischannel = outpict(:,:,c);
thischannel(thismask) = mean(thischannel(thismask));
outpict(:,:,c) = thischannel;
end
end
imshow(outpict)
Alternatively, this can be done a bit quicker with bwconncomp() instead, though perhaps the composition is a bit less obvious. Conveniences like cc2bw() didn't exist until recently.
% a color image
inpict = imread('triad.png');
% a mask selecting objects in the image
mk = max(inpict,[],3) > 32;
% isolate mask blobs
CC = bwconncomp(mk);
% compose the output image
outpict = reshape(inpict,[],size(inpict,3));
for k = 1:CC.NumObjects
idx = CC.PixelIdxList{k};
thiscolor = mean(outpict(idx,:),1);
outpict(idx,:) = repmat(thiscolor,[numel(idx) 1]);
end
outpict = reshape(outpict,size(inpict));
imshow(outpict)
The composition could probably also be done using labeloverlay(), but you'd still need something similar to the above examples in order to construct a colortable of mean blob colors. Also, labeloverlay() would be an anachronism here.
For a strictly grayscale image, the mean blob colors could be obtained from regionprops(), though composition would still require extra work.
1 个评论
DGM
2024-10-13
If we want to go down the anachronism path, then:
% a color image
inpict = imread('triad.png');
% a mask selecting objects in the image
mask = max(inpict,[],3) > 32;
% MIMT blobcolor and IPT labeloverlay()
CT = blobcolor_forum(inpict,mask,'mean');
outpict = labeloverlay(inpict,bwlabel(mask),'colormap',CT,'transparency',0);
imshow(outpict)
Like I said, labeloverlay() didn't exist until R2017b, and MIMT blobcolor() didn't exist until about a month ago. The attached version didn't exist until today.
另请参阅
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!