02 - 像素的访问方式

    技术2023-07-24  86

    /*************************************************************** * @file : main.cpp * @brief : Access pixel method * @author : YangL0322 * @version : V.0.0.1 * @cnblogs : httpswww.cnblogs.comkongqiweiliang * @History : modification - Date - Author - Information * **************************************************************/ #include <opencv2/core/core.hpp> #include<opencv2/highgui/highgui.hpp> #include"opencv2/imgproc/imgproc.hpp" #include <iostream> using namespace std; using namespace cv; void f_getPixel(unsigned char *srcData, int width, int height, int param); void f_getPixelMat(Mat& inputImage, Mat& outputImage, int div); void f_getPixelMat_methon3(Mat& inputImage, Mat& outputImage, int div); void f_getPixelMat_methon4(Mat& inputImage, Mat& outputImage, int div); void main() { Mat srcImage, dstImage; srcImage = imread("1.jpg"); dstImage = Mat::zeros(srcImage.size(), srcImage.type()); //【1】第一种访问像素方式 //f_getPixel(srcImage.data, srcImage.cols, srcImage.rows, 50); //imshow("DstImg", srcImage); //【2】第二种访问像素方式 用指针访问像素 //f_getPixelMat(srcImage, dstImage, 10); //imshow("DstImg", dstImage); //【3】第三种访问像素方式 //f_getPixelMat_methon3(srcImage, dstImage, 10); //imshow("DstImg", dstImage); //【3】动态地址运算配合at f_getPixelMat_methon4(srcImage, dstImage, 10); imshow("DstImg", dstImage); while (char(waitKey(1)) != 'q') {}//按下“q”键时,程序退出 //return 0; } //方法1: void f_getPixel(unsigned char *srcData, int width, int height, int param) { unsigned char* psrc = srcData; unsigned int temp; for (int i = 0; i < height; i++) { for (int j = 0; j < width*3; j=j+3) { temp = (psrc[j+0] + psrc[j+1] + psrc[j+2])/3; psrc[j+0] = temp + param; psrc[j+1] = temp + param; psrc[j+2] = temp + param; } psrc += width*3; } } //方法2:【21】用指针访问像素 void f_getPixelMat(Mat& inputImage, Mat& outputImage, int div) { outputImage = inputImage.clone(); //拷贝实参到临时变量 int rowNumber = outputImage.rows; //行数 int colNumber = outputImage.cols*outputImage.channels(); //列数 x 通道数=每一行元素的个数 unsigned int temp; for (int i = 0; i < rowNumber; i++) { uchar* data = outputImage.ptr<uchar>(i); for (int j = 0; j < colNumber; j=j+3)//列循环 { temp = (data[j + 0] + data[j + 1] + data[j + 2]) / 3; data[j+0] = temp + div / 2; data[j+1] = temp + div / 2; data[j+2] = temp + div / 2; } } } //方法3: 迭代器访问像素 void f_getPixelMat_methon3(Mat& inputImage, Mat& outputImage, int div) { outputImage = inputImage.clone(); //拷贝实参到临时变量 //获取迭代器 Mat_<Vec3b>::iterator it = outputImage.begin<Vec3b>(); //初始位置的迭代器 Mat_<Vec3b>::iterator itend = outputImage.end<Vec3b>(); //终止位置的迭代器 for (; it != itend; ++it) { // ------------------------【开始处理每个像素】-------------------- (*it)[0] = (*it)[0] / div*div + div / 2; (*it)[1] = (*it)[1] / div*div + div / 2; (*it)[2] = (*it)[2] / div*div + div / 2; // ------------------------【处理结束】---------------------------- } } //方法4: 迭代器访问像素 void f_getPixelMat_methon4(Mat& inputImage, Mat& outputImage, int div) { //参数准备 outputImage = inputImage.clone(); //拷贝实参到临时变量 int rowNumber = outputImage.rows; //行数 int colNumber = outputImage.cols; //列数 //存取彩色图像像素 for (int i = 0; i < rowNumber; i++) { for (int j = 0; j < colNumber; j++) { // ------------------------【开始处理每个像素】-------------------- outputImage.at<Vec3b>(i, j)[0] = outputImage.at<Vec3b>(i, j)[0] / div*div + div / 2; //蓝色通道 outputImage.at<Vec3b>(i, j)[1] = outputImage.at<Vec3b>(i, j)[1] / div*div + div / 2; //绿色通道 outputImage.at<Vec3b>(i, j)[2] = outputImage.at<Vec3b>(i, j)[2] / div*div + div / 2; //红是通道 // -------------------------【处理结束】---------------------------- } // 行处理结束 } }
    Processed: 0.010, SQL: 10