Setting certain pixels in a grayscale image to RGB (red) for MIP
이전 댓글 표시
Hey again. I have a grayscale image and would like to highlight certain pixels by setting them to red, e.g.
save_array = image;
save_array(Omega==1) = %RED
Is there an easy way to do this? I will be taking the image (3D array), calculating the MIP (max intensity projection) by
mip_final = max(save_array, [], 3);
and would then like the red pixels to appear on the MIP (2D). So if a pixel is red anywhere in the z-dimension, it will appear red in the 2D MIP
답변 (2개)
Image Analyst
2018년 8월 6일
Try this:
redChannel = grayImage; % Initialize
greenChannel = grayImage; % Initialize channel for green and blue channel.
redChannel(Omega) = 255;
greenChannel(Omega) = 0;
rgbImage = cat(3, redChannel, greenChannel, greenChannel);
댓글 수: 5
Image Analyst
2018년 8월 7일
What I did will set all pixels in a 2-D gray scale image to red wherever binary image Omega is true. There is nothing to project.
Your mip_final will not do that, You said your save_array is "a grayscale image". If you did convert it to an RGB image using my code, then using your code for taking the max along the 3rd (color channel) dimension will simply give you a gray scale image that will be pure white wherever the RGB image is red, or wherever any pixel in the green or blue channel is white. Not sure why you want this since it's basically just the same as skipping making the RGB image with red altogether and simply setting all pixels in Omega to white. I.e., same as
save_array(Omega) = 255;
So, not sure what you're really after. A screenshot of starting and desired final image would be good.
Image Analyst
2018년 8월 7일
OK, so you have a volumetric image, like from CT or MRI. So just mask the image
masked3DImage = grayImage3d; % Initialize
masked3DImage(~Omega) = -inf; % Mask
masked3DImage = max(masked3DImage , [], 3); % Do MIP
masked3DImage(~Omega) = 0; % minus infinity set to zero or whatever value you want outside of the mask.
Thorsten
2018년 8월 8일
From the above discussion, I came up with this solution:
% fake some data
X = rand(10, 10, 23);
N = prod(size(X));
idx = randi(N, 1, round(0.01*N)); % 1% of all pixels are 1
X(idx) = 1;
Omega = X == 1; % find the values that are 1 in X
idx = sum(Omega, 3) > 0; % project to a 2D binary image
MIP = max(X, [], 3);
% create a color image from MIP
R = MIP; R(idx) = 1;
G = MIP; G(idx) = 0;
B = MIP; B(idx) = 0;
I = cat(3, R, G, B);
imshow(I)
댓글 수: 8
Image Analyst
2018년 8월 8일
How are you showing the original 3-D projection? Do you mean like the MIP variable, which is a 2-D image created by projecting the 3-D image along the third dimension, or do you mean like some kind of perspective/volumetric view of the 3-D volume like it's a 3-D rectangular block with red pixels located at various locations inside that block?
Image Analyst
2018년 8월 8일
What if you used scatter3() to put a red marker at every location of the max in each column?
Alex G
2018년 8월 8일
Image Analyst
2018년 8월 9일
Yes, of course it does, because the other pixels are opaque. For true volume visualization, you can't use MATLAB, which is limited to isosurfaces and cutaway views last I checked. You'll need to use a true volume visualization program like Avizo.
You can visualize only the red blocks using plotcube from the FileExchange:
X = rand(10, 10, 23);
% X = rand(3000,1000,600);
N = prod(size(X));
idx = randi(N, 1, round(0.01*N)); % 1% of all pixels are 1
X(idx) = 1;
[x, y, z] = ind2sub(size(X), idx);
for i = 1:numel(x)
plotcube([1, 1, 1], [x(i) y(i) z(i)], .8, 'r')
if i == 1, hold on, end
end
axis equal
grid on
카테고리
도움말 센터 및 File Exchange에서 Lighting, Transparency, and Shading에 대해 자세히 알아보기
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!