Finding pixel numbers for certain colors

조회 수: 11 (최근 30일)
Bugrahan Guner
Bugrahan Guner 2023년 9월 12일
편집: DGM 2023년 9월 13일
Hi,
I want to be able to find which pixels are red which pixels are blue but with an extra issue. If a pixel is at the margin between red and blue, I want to find those pixels and group those pixels with any pixel that is two pixels away from it. I am attaching both the image I am working on and the one explaining the pixel issue. For the circled pixel in the image 'pixel selection', I need the pixel numbers of other marked ones. In the end since there will be coinciding pixel numbers (when it is applied for all pixels at the red-blue interface) I will eliminate the repeating ones directly. In the end I only need the pixel numbers for red, blue and red-blue interface.
Thanks in advance.
  댓글 수: 2
Image Analyst
Image Analyst 2023년 9월 13일
편집: Image Analyst 2023년 9월 13일
Not sure of your definition of "pixel numbers" or "coinciding pixel numbers". Do you want the RGB histogram ( a count of the numbers of pixels with each unique color)?
DGM
DGM 2023년 9월 13일
편집: DGM 2023년 9월 13일
The goal as described seems to be a list of the indices (or subscripts) of the 24 pixels surrounding each pixel in the transition area. That is, for subscripts, a big 600x1000x24x2 array (or some equivalent shape). How that would be used, I don't know.
That seems pretty questionable to me, so I'm just waiting to see if and why the direct use of the masks won't suffice.

댓글을 달려면 로그인하십시오.

채택된 답변

DGM
DGM 2023년 9월 12일
편집: DGM 2023년 9월 12일
That depends entirely on how you want to make the distinction between "red" or "blue" and colors which are in-between, because there are probably more colors in-between than what you think there are.
% the regions you think are uniform red/blue
% are not uniform at all since this is a JPG
inpict = imread('https://www.mathworks.com/matlabcentral/answers/uploaded_files/1480206/fullarea.jpg');
CT = [254 0 0; 0 0 254]; % the two color classes
% create masks
redmask = all(inpict == permute(CT(1,:),[1 3 2]),3);
blumask = all(inpict == permute(CT(2,:),[1 3 2]),3);
% the transition area is probably a lot larger
% and more irregular than you expect because of that damage
F = imfuse(redmask,blumask); % visualze both masks together
imshow(F,'border','tight')
% generate transition mask
rbmask = ~redmask & ~blumask; % these are the pixels in-between
rbmask = imdilate(rbmask,ones(5)); % pixels within 2px of in-between pixels
imshow(rbmask,'border','tight')
That's probably not very useful. Since we need something other than an exact match, it's probably easier to approach this from hue alone.
inpict = imread('https://www.mathworks.com/matlabcentral/answers/uploaded_files/1480206/fullarea.jpg');
% start by discriminating in H
% rotate H to avoid dealing with a split histogram
[H,~,~] = rgb2hsv(inpict);
H = mod(H-2/3+0.1,1);
% generate red/blue masks
H0 = [0.1 0.43]; % the target hues (shifted)
halfw = 0.05; % the tolerance
redmask = abs(H-H0(2)) <= halfw;
blumask = abs(H-H0(1)) <= halfw;
F = imfuse(redmask,blumask);
imshow(F,'border','tight')
% generate transition mask
rbmask = ~redmask & ~blumask;
rbmask = imdilate(rbmask,ones(5));
imshow(rbmask,'border','tight')
Note that the dilated rbmask overlaps both redmask and blumask now. If you need to remove the overlap area from redmask and blumask, just do
redmask = redmask & ~rbmask;
blumask = blumask & ~rbmask;
Similarly, the same thing could be accomplished by eroding those masks prior to generating rbmask, thereby eliminating the need to dilate rbmask.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Image Processing Toolbox에 대해 자세히 알아보기

Community Treasure Hunt

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

Start Hunting!

Translated by