遍歷影象畫素點的方法
一:椒鹽噪點的例子(隨機遍歷影象的某個畫素點)
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:被用來對計算結果進行截斷,這是因為對畫素值進行計算時,經常會導致結果超出畫素允許的取值範圍。