OpenCV)픽셀 다루기
* 참고
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 |
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 | g | 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. 방법에 따른 처리 속도 비교