By Abdul Rehman
Color Segmentation is very basic problem in digital image processing. Most of the time we need to segment Object based on their colors. So Color segmentation comes in handy in such scenarios. Today, we are going to explain how to segment RGB Image based on some basic Primary Colors. This technique could also be applied to segment colors other than primary colors. So We will also see that Yellow and Orange Colors are also segmented while applying threshold for RED Colors.
First of all lets take a sample image on which we are going to apply all our color segmentation algorithm. This Image comes with MATLAB Image Processing Toolbox. So You can just type this command in command window in MATLAB.
Now we have our image which is in RGB Color Space. We can extract Red Matrix and Convert RGB Image into grayscale Image.
>>gray_x = rgb2gray(x); >>red_x = x(:,:,1);
Now if we subtract this gray scale Image from Red matrix then we will get the correct light shadings and only red objects. Also note that here we will also get red color objects which are mixture of other colors as well. Like Yellow and Orange Color who have Green color mixed with Red Color. Because these colors contain 255 value of RED and some portion of Green in them. Because of High Red portion we will not able to directly eliminate these objects. We will see how to eliminate these colors at end of this tutorial. For now just get a subtracted image like this
>>sub_x = imsubtract(red_x,gray_x); >>figure,imshow(sub_x);
Now we need to convert this image into binary image with specified threshold value and After that threshing we need to create a mask and finally convert that mask into 3 dimensions so that we would be able to apply that mask onto our RGB Image. Which is also a 3 dimensional Image, so we need a 3 dimensional mask to apply on. Finally We will remove all other pixels than the mask and get the result as follows.
>>bin_x = im2bw(sub_x,0.21); >>mask = ~bin_x; >>mask3 = cat(3,mask,mask,mask) >>new_x = x; %create a backup copy of original image >> new_x(mask3) = 0; >>figure,imshow(new_x);
Here you can see how Yellow and Orange Peppers are also displayed along with Red one which were our desired peppers. But Now we are getting wrong objects detected as our desired objects.
Now we are going to filter out RED color along with Green Color. The reason to choose Green color rather than blue is because of our unwanted Yellow and Orange Objects which holds Green in them. So We are actually building a foundation toward Eliminating those unwanted color objects. So here is the code to combine two colors and detected more than one color in a Image or Video frame.
>>green_x = x(:,:,2); %get green matrix just like the red one >>gsub_x = imsubtract(green_x,gray_x); %subtract gray from green >>figure,imshow(gsub_x);
Now if you notice that the image now contain very less information. Because of very low portion of green in it. So we need to reduce the threshold value for detecting green color in this Image. So just apply this value and see the results now.
>>gbin_x = im2bw(gsub_x,0.01); >>figure,imshow(gbin_x);
Now It may seem confusing that although we are subtracting images but the resultant effect would be a combination of two colors. This is just because the resultant image will be a 1 if one color is present in one image but not in other. But if both of the Images contains 1 then the resultant image will get 0 at their.
%% Read Original Image x=imread('peppers.png'); gray_x = rgb2gray(x); %% Extract Red Space red_x = x(:,:,1); rsub_x = imsubtract(red_x,gray_x); %% Red to binary rbin_x = im2bw(rsub_x,0.3); rbmask = im2bw(imcomplement(rbin_x)); rbmask = cat(3,rbmask,rbmask,rbmask); only_red_x = x; only_red_x(rbmask)=0; figure,subplot(2,1,1),imshow(x),title('original Peppers Image'); subplot(2,1,2),imshow(only_red_x),title('red objects found'); %% display red_sub figure,imshow(rsub_x); figure,imshow(x),title('Original Peppers Image') %% green_x = x(:,:,2); gsub_x = imsubtract(green_x,gray_x); figure,imshow(gsub_x),title('Green Matrix') gbin_x = im2bw(gsub_x,0.01); figure,imshow(gbin_x),title('green to binary with 0.01 threshold') %% mask only green objects only_green_x = x; ogx_mask = im2bw(double(imcomplement(gbin_x))); ogx_mask = cat(3,ogx_mask,ogx_mask,ogx_mask); only_green_x(ogx_mask)=0; figure,imshow(only_green_x),title('Green Objects Subtracted'); %% subtract together comb_x = x; abs_comb_x = x; combined_x = imsubtract(rbin_x,gbin_x); abs_cx = abs(imsubtract(rbin_x,gbin_x)); %% apply masks mk1 = im2bw(imcomplement(combined_x)); mk2 = im2bw(imcomplement(abs_cx)); mk1 = cat(3,mk1,mk1,mk1);mk2=cat(3,mk2,mk2,mk2); comb_x(mk1)=0;abs_comb_x(mk2)=0; %% plotting figure,subplot(2,2,1),imshow(combined_x); title('without abs') subplot(2,2,2),imshow(abs_cx),title('with abs') subplot(2,2,3),imshow(comb_x),title('without abs x') subplot(2,2,4),imshow(abs_comb_x),title('with abs x')
Here is the combined Effect of both colors
Now here is the final code which will remove unwanted yellow and Orange Color from the Image and after that we presented the final resultant Image. This image could be enhanced by applying some filtration on binary image but we leave this on to user and may be to our next tutorial.
clear all; close all; clc; %% x = imread('peppers.png'); red_x = x(:,:,1); green_x = x(:,:,2); gray_x = rgb2gray(x); %% GET ONLY RED OBJECTS sub_rg=imsubtract(red_x,green_x); sub_rg_gray = imsubtract(sub_rg,gray_x); only_red_bin = im2bw(sub_rg_gray,0.18); %% Prepare and Apply Mask only_red_mask = im2bw(imcomplement( only_red_bin)); only_red_mask = cat(3,only_red_mask,only_red_mask,only_red_mask); only_red_x = x; only_red_x(only_red_mask)=0; %% display Results figure,imshow(x),title('original image'), figure,imshow(only_red_x),title('extracted objects');
The Motivated Engineer, “Image Processing in MATLAB Tutorial 2 – Color Thresholding,” YouTube. 2020. [Accessed: 04-Apr-2020].
“How to impose Binary mask on rgb color image – MATLAB Answers – MATLAB Central,” Mathworks.com, 2017. [Online]. Available: https://nl.mathworks.com/matlabcentral/answers/341305-how-to-impose-binary-mask-on-rgb-color-image. [Accessed: 04-Apr-2020].
18 January 2021
12 January 2021
06 January 2021
12 December 2020
FYP Solutions Powered By Impressive Business WordPress Theme