How can I use one plane of RGB as a mask for other planes and generate new image?

1 回表示 (過去 30 日間)
Original = imread('Image.tif');
[x,y,n]=size(Original);
% %-------------------------------Red Plane
Red(:,:,2)=zeros(x,y);
Red(:,:,3)=zeros(x,y);
Red(:,:,1)= Original(:,:,1);
%--------------------------------- Green Plane
Green(:,:,3)=zeros(x,y);
Green(:,:,1)=zeros(x,y);
Green(:,:,2)= Original(:,:,2);
% -- - - - - - - - - -------------- Blue Plane
Blue(:,:,2)=zeros(x,y);
Blue(:,:,1)=zeros(x,y);
Blue(:,:,3)= Original(:,:,3);
%-------------------------converts the green planes to Black and White to make mask
GreenBW= im2bw(Original(:,:,2));
OriginalMasked(:,:,1) = GreenBW.*Red(:,:,1);
OriginalMasked(:,:,2) = Green(:,:,2);
OriginalMasked(:,:,3) = GreenBW.*Blue(:,:,3);
imshow(OriginalMasked);
  2 件のコメント
Walter Roberson
Walter Roberson 2015 年 8 月 21 日
What you have looks okay.
Kamran Moradi
Kamran Moradi 2015 年 8 月 21 日
The numbers are the same as you can see in in the command picture, but the result is different, that region is yellow but it is white in masked one. The variable format has been changed also from unit8 to double. Still confusion...

サインインしてコメントする。

採用された回答

Walter Roberson
Walter Roberson 2015 年 8 月 21 日
When you are creating Red, Green, Blue, copy over Original first so that you get the correct datatype for the destination. Currently you are copying it last.
  4 件のコメント
Kamran Moradi
Kamran Moradi 2015 年 8 月 21 日
編集済み: Kamran Moradi 2015 年 8 月 21 日
Thank you for your great advises. It Worked.
Original = imread('Image.tif');
[x,y]=size(Original);
% %-------------------------------Red Plane
Red(:,:,1)= Original(:,:,1);
Red(:,:,2)=0;
Red(:,:,3)=0;
% %--------------------------------- Green Plane
Green(:,:,2)= Original(:,:,2);
Green(:,:,3)=0;
% % -- - - - - - - - - -------------- Blue Plane
Blue(:,:,3)= Original(:,:,3);
GreenBW= im2bw(Original(:,:,2));
OriginalMasked = bsxfun(@times, Original, cast(GreenBW, 'like', Original));
imshow(OriginalMasked);
Image Analyst
Image Analyst 2015 年 8 月 21 日
Be careful about using non-standard definitions for x and y like you did. That usually eventually leads to trouble. Most people would do
[y, x] = size(TwoDMatrix);
Of course you didn't do that, and you did something even more risky or dangerous - you used it on an image read in from imread(). Why is it dangerous to use
[x, y] = size(theImage);
instead of
[rows, columns, numberOfColorChannels] = size(theImage);
If you don't use a third argument on an image array, and the image array is a color image, the second argument ("x" or "y" as you called it) will actually be the number of columns multiplied by the number of color channels.

サインインしてコメントする。

その他の回答 (2 件)

Image Analyst
Image Analyst 2015 年 8 月 21 日
An alternate way to mask an RGB image by a logical 2D mask image, promoted by Sean, is this:
% Mask the image using bsxfun() function
maskedRgbImage = bsxfun(@times, rgbImage, cast(mask, 'like', rgbImage));
  1 件のコメント
Kamran Moradi
Kamran Moradi 2015 年 8 月 21 日
編集済み: Kamran Moradi 2015 年 8 月 21 日
Thank you for the answer, but the result is the same as above. The numbers are the same as you can see in in the command picture, but the result is different, that region is yellow but it is white in masked one. Still confusion... This command is faster though and does not have variable type problem

サインインしてコメントする。


Negesse Tadesse
Negesse Tadesse 2019 年 7 月 31 日
does it help for image compresson?
  1 件のコメント
Image Analyst
Image Analyst 2019 年 7 月 31 日
Does what help with image compression? Masking? It will make the images smaller because much of the image is replaced by a constant number.

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeImages についてさらに検索

タグ

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by