dennlinger
dennlinger

Reputation: 11430

Matlab get vector of specific pixels

I am pretty new to Matlab and encountered a problem when working with images. I want to get a pixel that is in a specific colour (blue) in the following image: image My current code looks something like this:

    function p = mark(image)
    %// display image I in figure
    imshow(image);

    %// first detect all blue values higher 60
    high_blue = find(image(:,:,3)>60);
    %cross elements is needed as an array later on, have to initialize it with 0
    cross_elements = 0;
    %// in this iteration the marked values are reduced to the ones
    %where the statement R+G < B+70 applies
    for i = 1:length(high_blue)
    %// my image has the size 1024*768, so to access the red/green/blue values
    %// i have to call the i-th, i+1024*768-th or i+1024*768*2-th position of the "array"
        if ((image(high_blue(i))+image(high_blue(i)+768*1024))<...
                image(high_blue(i)+2*768*1024)+70)
            %add it to the array
            cross_elements(end+1) = high_blue(i);
        end
    end
    %// delete the zero element, it was only needed as a filler
    cross_elements = cross_elements(cross_elements~=0);

    high_vector = zeros(length(cross_elements),2);
    for i = 1:length(cross_elements)
            high_vector(i,1) = ceil(cross_elements(i)/768);
            high_vector(i,2) = mod(cross_elements(i), 768);
    end

    black = zeros(768 ,1024);
    for i = 1:length(high_vector)
        black(high_vector(i,2), high_vector(i,1)) = 1;
    end
    cc = bwconncomp(black);
    a = regionprops(cc, 'Centroid');
    p = cat(1, a.Centroid);
    %// considering the detection of the crosses:
    %// RGB with B>100, R+G < 100 for B<150
    %// consider detection in HSV?
    %// close the figure
    %// find(I(:,:,3)>150)

    close;
end

but it is not optimized for Matlab, obviously. So i was wondering if there was a way to search for pixels with specific values, where the blue value is larger than 60 (not hard with the find command, but at the same time the values in the red and green area not too high. Is there a command I am missing? Since English isn't my native language, it might even help if you gave me some suitable keywords for googling ;) Thanks in advance

Upvotes: 0

Views: 87

Answers (1)

Benoit_11
Benoit_11

Reputation: 13945

Based on your question at the end of the code, you could get what you want in a single line:

NewImage = OldImage(:,:,1) < SomeValue & OldImage(:,:,2) < SomeValue & OldImage(:,:,3) > 60;
imshow(NewImage);

for example, where as you see you provide a restriction for each channel using logical operators, that you can customize of course (eg. using | as logical OR). Is this what you are looking for? According to your code you seem to be looking for specific regions in the image like crosses or coins is that the case? Please provide more details if the code I gave you is completely off the track :)

Simple example:

A = imread('peppers.png');
B = A(:,:,3)>60 & A(:,:,2)<150 & A(:,:,1) < 100;
figure;
subplot(1,2,1);
imshow(A);
subplot(1,2,2)
imshow(B);

Giving this:

enter image description here

Upvotes: 1

Related Questions