使用openCV进行图像处理,总感觉并不能真正的理解图像处理的核心内容,因此我感觉对图像处理的理解才是关键。
基本的反色操作,主要是了解OpenCV对图像数据的操作方式:指针
如下:
unsigned char * ptr;//定义指针
for(int i = 0 ;i < img->height;i++){
ptr= (unsigned char*)img->imageData+ i*img->widthStep;//根据偏移获取数据
for(int j = 0 ; j< img->width; j++){
*(ptr+3*j) -= 20;
*(ptr + 3* j+1) -= 20;
*(ptr + 3*j +2) -= 20;
}
}
同时注意对图像真彩和灰度的判定:
image->nChannels == 3 真彩
image->nChannels == 1 灰度
#include<cv.h>
#include<highgui.h>
int main(){
IplImage * image;
image = cvLoadImage("E:\\image\\breast.tif",1);
cvNamedWindow("image",CV_WINDOW_AUTOSIZE);
cvSaveImage("E:\\image\\breast.jpg",image,0);
cvShowImage("image",image);
cvWaitKey(0);
unsigned char * ptr;
if(image->nChannels == 3){
for(int i = 0 ; i < image->height;i++){
ptr = (unsigned char *)image->imageData + i*image->widthStep;
for(int j = 0; j< image->width;j++){
*(ptr + 3*j) = 255 - (*(ptr +3*j));
*(ptr + 3*j +1) = 255 - (*(ptr +3*j+1));
*(ptr + 3*j+2) = 255 - (*(ptr +3*j+2));
}
}
}
else if(image->nChannels == 1){
for(int i = 0 ; i < image->height;i++){
ptr = (unsigned char *)image->imageData + i*image->widthStep;
for(int j = 0; j< image->width;j++){
*(ptr + j) = 255 - (*(ptr +j));
}
}
}
cvShowImage("image",image);
cvWaitKey(0);
cvSaveImage("E:\\image\\breast2.jpg",image,0);
return 0;
}