一:椒盐噪点的例子(随机遍历图像的某个像素点)
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:被用来对计算结果进行截断,这是因为对像素值进行计算时,经常会导致结果超出像素允许的取值范围。