遍历图像的方法 第二章

时间:2023-01-11 23:11:50

一:椒盐噪点的例子(随机遍历图像的某个像素点)

void salt(Mat &image,int n){

for(int k=0;k<n;k++){

//rand():随机数产生函数

int i=rand()%image.cols;

int j=rand()%iimage.rows;

if(image.channels()==1)

//通过通道,判断是灰度图还是彩色图。若channels是1,则灰度图

image.at<uchar>(j,i)=255;

else if(image.channels()==3)

//若channels 是3,则彩色图。

{

image.at<Vec3b>(j,i)[0]=255;

image.at<Vec3b>(j,i)[1]=255;

image.at<Vec3b>(j,i)[2]=255;

}

}

}

二:颜色缩减的例子(一):

void colorReduce(Mat &image,int div=64){

int n1=image.rows;//行数

int nc=image.cols*image.channels();

for(int j=0;j<n1;j++){

//得到第j行的首地址

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

for(int i=0;i<nc;i++){

//处理每一个像素……

data[i]=data[i]/div*div+div/2;

//像素处理完成

}

}

}

三:颜色缩减的例子(二)

Mat image;

Mat result;

result.create(image.rows,image.cols,image.type());//注意:先rows再cols

void colorReduce(Mat &image,Mat &result,int div=64){

int n1=image.rows;//行数

int nc=image.cols*image.channels();

for(int j=0;j<n1;j++){

const char* data_in=image.ptr<uchar>(j);

uchar* data_out=result.ptr<uchar>(j);

for(int i=0;i<nc;i++){

//处理每个像素

data_out[i]=data.in[i]/div*div+div/2;

//像素处理完成

}

}

}

四:颜色缩减的例子(三)使用迭代器

void colorReduce(Mat &image,int div=64){

//得到初始位置的迭代器

Mat_<Vec3b>::iterator it=image.begin<Vec3b>();

//得到终止位置的迭代器

Mat_<Vec3b>::iterator itend=image.end<Vec3b>();

//遍历所有像素

for(;it!=itend;++it){

(*it)[0]=(*it)[0]/div*diiv+div/2;

(*it)[1]=(*it)[1]/div*diiv+div/2;

(*it)[2]=(*it)[2]/div*diiv+div/2;

//处理像素完成

}

]



若想从第二行开始,则

image.begin<Vec3b>()+image.rows来初始化迭代器

若想在图像的最后一行之前停止,则

image.end<Vec3b>()-image.rows


五:遍历图像和邻域操作

对图像进行锐化。基于拉普拉斯算子。

将一幅图像减去他经过拉普拉斯滤波之后的图像,这幅图像的边缘部分将得到放大,即细节部分更加锐利。

void  sharpen(const Mat &image,Mat &result){

result.create(image.size(),image.type());

for(int j=1;j<image.rows-1;j++){

const uchar* previous=image.ptr<const uchar>(j-1);//上一行

const uchar* current=image.ptr<const uchar>(j);//当前行

const uchar* next=image.ptr<const uchar>(j+1);//下一行

uchar* output=result.ptr<uchar>(j);//输出行

for(int i=1;i<image.cols-1;i++){

*output++=saturate_cast<uchar>(5*current[i]-current[i-1]-current[i+1]-previous[i]-next[i]);

}

}

//将未处理的像素设置为0

result.row(0).setTo(Scalar(0));

result.row(result.rows-1).setTo(Scalar(0));

result.col(0).setTo(Scalar(0));

result.row(result.cols-1).setTo(Scalar(0));

}

注意:该例子是在测试图像的灰度版本上进行的。

saturate_cast:被用来对计算结果进行截断,这是因为对像素值进行计算时,经常会导致结果超出像素允许的取值范围。