OpenCV遍历像素常见有三种方式:
1、双循环遍历
void TraversalPixel_1(cv::Mat& image_in,cv::Mat& image_out,int div)
{
image_out = image_in.clone();
int rowNumber = image_in.rows;
int colNumber = image_in.cols * image_out.channels();
for (int i = 0; i < rowNumber; i++)
{
uchar* data = image_out.ptr<uchar>(i);
for (int j = 0 ;j < colNumber;j++)
{
data[j] = data[j]/div*div + div/2;
}
}
}
2、迭代器
void TraversalPixel_2(cv::Mat& image_in,cv::Mat& image_out,int div)
{
image_out = image_in.clone();
cv::Mat_<cv::Vec3b>::iterator it = image_out.begin<cv::Vec3b>();
cv::Mat_<cv::Vec3b>::iterator itend = image_out.end<cv::Vec3b>();
for (; it != itend ;++it)
{
(*it)[0] = (*it)[0] / div * div + div/2;
(*it)[1] = (*it)[1] / div * div + div/2;
(*it)[3] = (*it)[2] / div * div + div/2;
}
}
3、动态地址计算
void TraversalPixel_3(cv::Mat& image_in,cv::Mat& image_out,int div)
{
image_out = image_in.clone();
int rowNumber = image_out.rows;
int colNumber = image_out.cols;
for (int i = 0 ; i < rowNumber ; ++i)
{
for (int j = 0 ; j < colNumber;j++)
{
image_out.at<cv::Vec3b>(i,j)[0] = image_out.at<cv::Vec3b>(i,j)[0] / div * div + div/2;
image_out.at<cv::Vec3b>(i,j)[1] = image_out.at<cv::Vec3b>(i,j)[1] / div * div + div/2;
image_out.at<cv::Vec3b>(i,j)[2] = image_out.at<cv::Vec3b>(i,j)[2] / div * div + div/2;
}
}
}