Search This Blog

Friday, August 15, 2014

Selective Color Modification

အောက်မှာ ပြထားတဲ့ ပုံထဲက လမ်းအပြာလေးကိုပဲ ရွေးပြီး အစိမ်းရောင် ပြောင်းကြည့် ချင်တာနဲ့ MatLab program လေး ရေးကြည့်ပြီး Octave သုံးပြီး run ကြည့်လိုက်တယ်။ အပြာရောင် ကို အစိမ်းပြောင်းချင်တာဆိုတော့ rgb color model မှာပဲ blue နဲ့ green ကို နေရာချင်း လဲလိုက်ရင် ရပေမယ့် သိပ် ယေဘူယျ မဆန်ဘူးထင်တာနဲ့ hsv color model သုံးလိုက်တယ်။ အဲဒါဆို hue ကို ကြိုက်တဲ့ အရောင်ကနေ လိုချင်တဲ့ အရောင်ကို အလွယ်တကူ ပြောင်းလို့ရသွားတာပေါ့။
Matlab program ကို အောက်မှာပြထားမှာတယ်။ ရှင်းလင်းချက်တွေကို comment တွေအနေနဲ့ ရေးထားပါတယ်။
%enter 'pkg load image' in the octave command windows
%to load the required image processing package.
%----------------------------------------------------------------------
%get images
I=imread('ori.jpg');
I=im2double(I);
%----------------------------------------------------------------------
%convert to HSV
Ihsv=rgb2hsv(I);
Ih=Ihsv(:,:,1);
Is=Ihsv(:,:,2);
Iv=Ihsv(:,:,3);
%----------------------------------------------------------------------
%get the mask for blue primary which is at 240 degree in hsv
bdeg=240/360;
Im=abs(Ih-bdeg);
%since the distance cannot be larger then 180 degree,
%the values greater than 0.5 should be subtracted from 1
Ii=Im>0.5;
Im=abs(Ii-Im);
%--------------------------------------------------------------------------
%get the global image threshold using Otsu's method
Ith=graythresh(Im);
%--------------------------------------------------------------------------
%make it binary (black and white)
Im=im2bw(Im,Ith);
imshow(Im);%show the mask
Im=cat(3,Im,Im,Im);
%--------------------------------------------------------------------------
%define an angle to rotate H in degree
a=240;
%convert to fraction, add to H, and find modulus
Ih=mod(Ih+a./360,1);
%--------------------------------------------------------------------------
%convert to RGB
Ihsv=cat(3,Ih,Is,Iv);
Ic=hsv2rgb(Ihsv);
%--------------------------------------------------------------------------
%Modified the masked pixels
Ic2=I.*Im+Ic.*(1-Im);
%----------------------------------------------------------------------
%Display results
scrsz = get(0,'ScreenSize');
scrLeft=scrsz(1);
scrBottom=scrsz(2);
scrWidth=scrsz(3);
scrHeight=scrsz(4);

handle1=figure;    
set(handle1,'Position',[(100) (100) (scrWidth-200) (scrHeight-200)]);
% Position: Left Bottom Width Height

subplot(1,3,1);
imshow(I); 
title('Original');

subplot(1,3,2);
imshow(Ic); 
title('Color modification'); 

subplot(1,3,3);
imshow(Ic2); 
title('Selective color modification'); 
%----------------------------------------------------------------------
imwrite(Ic2,'scc.jpg');
အဲဒါကို Octave မှာ run ဖို့ Octave နဲ့ သူ့ရဲ့ packages တွေကို စက်ထဲမှာ ထည့်ထားဖို့ လိုပါတယ်။ Octave အကြောင်းက ဒီမှာ ပြောဘူးပါတယ်။ Image နဲ့ ဆိုင်တဲ့ package ကို လိုတဲ့ အတွက် octave ရဲ့ command windows မှာ 'pkg load image' လို့ အရင် ရိုက်ထည့်ဖို့လိုပါတယ်။ နောက် ပရိုဂရမ် ထည့်ထားတဲ့ နေရာကို 'chdir' နဲ့ သွားပါတယ်။ ပြီးတော့ ရေးထားတဲ့ MatLab ပရိုဂရမ်ကို run ပါတယ်။ Octave command windows ကို အောက်မှာ ပြထားပါတယ်။
ပရိုဂရမ် ကထုတ်ပြတဲ့ ရလဒ် နဲ့ နောက်ဆုံးထွက်လာတဲ့ ပုံတွေကို အောက်မှာ ပြထားပါတယ်။
အဲဒီ MatLab pragram ကို Selective_Color_Modification on GitHub မှာ တွေ့နိုင် ပါတယ်။ OpenCV နဲ့ ပါ ထပ်ဖြည့်ထားပါတယ်။

//File: color.cpp
//Description: Selective Color Modification
//WebSite: http://cool-emerald.blogspot.com
//MIT License (https://opensource.org/licenses/MIT)
//Copyright (c) 2017 Yan Naing Aye

#include 
#include 
using namespace cv;
int main(int argc, char** argv)
{
 Mat image;
 image = imread("C:/opencv/lane.jpg", 1);
 if (!image.data) {
  printf("No image data \n");
  return -1;
 }
 namedWindow("Display Image", WINDOW_AUTOSIZE);
 imshow("Display Image", image);

 //Convert to hsv
 Mat hsv;
 cvtColor(image, hsv, COLOR_BGR2HSV);

 //select pixels
 //the range of H channel is 0-179.
 //blue at 240 deg corresponds to 120 in H channel
 Mat bw;
 inRange(hsv, Scalar(80, 0, 0), Scalar(140, 255,255), bw);
 namedWindow("Mask", WINDOW_AUTOSIZE);
 imshow("Mask", bw);

 //Manipulate pixels
 for (int i = 0; i < image.rows; i++)
  for (int j = 0; j < image.cols; j++) 
   if (bw.at<uchar>(i, j) > 128) 
    hsv.at<Vec3b>(i, j)[0] = (hsv.at<Vec3b>(i, j)[0] + 120) % 180;

 //Convert to bgr
 Mat im2;
 cvtColor(hsv, im2, COLOR_HSV2BGR);

 namedWindow("Modified Image", WINDOW_AUTOSIZE);
 imshow("Modified Image", im2);

 waitKey(0);
 return 0;
}

No comments:

Post a Comment