1. 程式人生 > >遍歷影象畫素點的方法

遍歷影象畫素點的方法

一:椒鹽噪點的例子(隨機遍歷影象的某個畫素點)

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:被用來對計算結果進行截斷,這是因為對畫素值進行計算時,經常會導致結果超出畫素允許的取值範圍。