OpenCV

OpenCV)픽셀 다루기

Hgrace 2016. 9. 18. 14:38

* 참고

http://www.kocw.net/home/search/kemView.do?kemId=434142


1. 픽셀에 임의 접근하기

*image Invert(영상 반전)

*value = 255 - value


C++ 코드)

int main(void){

...    

Mat image = imread( ... );        // Mat 객체

...


if(image.channels() == 3)        // 컬러 이미지

colorinvert(image);

else if(image.channels() == 1)  // 흑백 이미지

grayscaleinvert(image);

...

}


* 영상 좌표 / 행렬 위치

P(x1(c1), y1(r1)) 

영상 좌표(x1, y1)

행렬 위치(r1, c1)


* at() method (처리시간 오래 걸림) 

                y(행)     x(열)    

* Mat::at<Datatype>(int row, int col)

* for grayscale images

image.at<uchar> (r,c) = value;


100개 픽셀 - 100개 elements


 v

 v

 v

 v

 v

 v

 v

 v




* for ture color images

image.at<Vec3b> (r,c)[channel] = value;

channel: 0(B), 1(G), 2(R) (각 B,G,R에 대응)


100개 픽셀 - 300개 elements (B,G,R)


b

r

 b

 g

r

 b

 g

 


* Vec(Type, Number>

* typedef Vec(uchar, 3) Vec3b;


void colorinvert(Mat &image){

int numOfLines = image.rows    // 이미지의 행 개수    (가로)    number of lines in the image

int numOfPixels = image.cols    //  이미지의 열 개수    (세로)    number of pixels per a line


for(int r = 0; r< numOfLines; r++){

for(int c = 0; c< numOfPixels; c++){

Vec3b &vec = image.at<Vec3b>(r, c);

vec[0] = 255 - vec[0];

vec[1] = 255 - vec[1];

vec[2] = 255 - vec[2];

}

}

}

void grayscaleinvert( Mat &image )

{

int numOfLines = image.rows; // number of lines in the image

int numOfPixels = image.cols; // number of pixels per a line


for( int r=0; r<numOfLines; r++ )

{

for( int c=0; c<numOfPixels; c++ )

{

uchar &value = image.at<uchar>( r, c );

value = 255 – value;

}

}

}


* operator() method (결과는 at() method와 같지만 처리속도가 더 빠름)

*Mat_ (row, col)

*for grayscale image

Mat_ <uchar) grayimage = image;

grayimage(r,c) = value;




* for true color image

Mat_ <Vec3b> colorimage = image;

colorimage(r,c)[channel] = value;


void colorinvert(Mat &image){

int numOfLines = image.rows    // 이미지의 행 개수    (가로)    number of lines in the image

int numOfPixels = image.cols    //  이미지의 열 개수    (세로)    number of pixels per a line

Mat_ <Vec3b> cimage = image;


for(int r = 0; r< numOfLines; r++){

for(int c = 0; c< numOfPixels; c++){

Vec3b &vec = cimage(r, c);

vec[0] = 255 - vec[0];

vec[1] = 255 - vec[1];

vec[2] = 255 - vec[2];

}

}

}

void grayscaleinvert( Mat &image )

{

int numOfLines = image.rows; // number of lines in the image

int numOfPixels = image.cols; // number of pixels per a line


Mat_<uchar> gimage = image;

for( int r=0; r<numOfLines; r++ )

{

for( int c=0; c<numOfPixels; c++ )

{

uchar &value = gimage( r, c );

value = 255 – value;

}

}

}


2. 영상 스캐닝하기


* Ptr() method

*Mat::ptr<Datatype>(int row)

*for grayscale image

uchar* data = image.ptr<uchar>(r);


* for true color image

vec3b* data = image.ptr<vec3b>(r);



3. 방법에 따른 처리 속도 비교