• opencv学习之路(7)、访问图像像素


    一、动态地址访问

     1 #include <opencv2/opencv.hpp>
     2 #include<iostream>
     3 using namespace cv;
     4 using namespace std;
     5 
     6 void main(){
     7     //动态地址访问
     8     Mat img=imread("E://green.png");
     9     imshow("src",img);
    10     Mat dst=img.clone();
    11     int rowNumber=img.rows;//获取行数
    12     int colNumber=img.cols;//获取列数
    13     for(int i=0;i<rowNumber;i++){
    14         for (int j = 0; j <colNumber; j++)
    15         {
    16             dst.at<Vec3b>(i,j)[0]=255;//蓝色通道
    17             dst.at<Vec3b>(i,j)[1]=0;//绿色通道
    18             dst.at<Vec3b>(i,j)[2]=0;//红色通道
    19             //dst.at<uchar>(i,j)=255;//灰度图像
    20         }
    21     }
    22     imshow("dst",dst);
    23     waitKey(0);
    24 }

    二、指针访问(速度快)

     1 #include <opencv2/opencv.hpp>
     2 #include<iostream>
     3 using namespace cv;
     4 using namespace std;
     5 
     6 void main(){
     7         Mat img=imread("E://green.png");
     8     imshow("src",img);
     9     Mat dst=img.clone();
    10     int rowNumber=img.rows;//获取行数
    11     int colNumber=img.cols*img.channels();//列数×通道数=每一行的元素个数
    12     for(int i=0;i<rowNumber;i++){
    13         uchar* data=dst.ptr<uchar>(i);//获取每一行首地址,ptr函数可以得到图像任意行的首地址
    14         for (int j = 0; j <colNumber; j++)
    15         {
    16             //data[j]=255;//灰度图
    17             switch (j%3)
    18             {
    19             case 0://蓝色通道
    20                 data[j]=255;
    21                 break;
    22             case 1://绿色通道
    23                 data[j]=0;
    24                 break;
    25             case 2://红色通道
    26                 data[j]=255;
    27                 break;
    28             }
    29         }
    30     }
    31     imshow("dst",dst);
    32     waitKey(0);    
    33 }

    三、迭代器访问(了解)

     

    四、减色效果

     1 Mat img=imread("E://1.jpg");
     2     imshow("src",img);
     3     Mat dst=img.clone();
     4     int rowNumber=img.rows;
     5     int colNumber=img.cols*img.channels();//获取每一行的元素
     6     for(int i=0;i<rowNumber;i++){
     7         uchar* data=dst.ptr<uchar>(i);//获取每一行首地址
     8         for (int j = 0; j <colNumber; j++)
     9         {
    10             switch (j%3)
    11             {
    12             case 0://蓝色通道
    13                 data[j]=data[j]/64*64+64/2;
    14                 break;
    15             case 1://绿色通道
    16                 data[j]=data[j]/64*64+64/2;
    17                 break;
    18             case 2://红色通道
    19                 data[j]=data[j]/64*64+64/2;
    20                 break;
    21             }
    22         }
    23     }
    24     imshow("dst",dst);
    25     waitKey(0);

    减色原理   data[j]=data[j]/64*64+64/2  可参考http://blog.csdn.net/lanchunhui/article/details/51167153

    五、随机产生椒盐噪声

     1 #include <opencv2/opencv.hpp>
     2 #include<iostream>
     3 using namespace cv;
     4 using namespace std;
     5 
     6 void main(){
     7     Mat img=imread("E://1.jpg");
     8     imshow("src",img);
     9     Mat dst=img.clone();
    10     int rowNumber=img.rows;
    11     int colNumber=img.cols;
    12     int i,j;
    13     for (int k = 0; k < 400; k++)//产生噪声的个数(此时为400)
    14     {
    15         i=rand()%rowNumber;//任意数对行数取余
    16         j=rand()%colNumber;//任意数对列数取余
    17         dst.at<Vec3b>(i,j)[0]=255;
    18         dst.at<Vec3b>(i,j)[1]=255;
    19         dst.at<Vec3b>(i,j)[2]=255;//将这三行的“255”设置为“0”即产生椒噪声
    20     }
    21     imshow("dst",dst);
    22     waitKey(0);
    23 }

     

  • 相关阅读:
    WPF鼠标拖放功能(拖放图片,文本)
    PHP封装属性
    vs 启动时报错:未能加载文件或程序集 SharpGit
    C#.NET Winform承载WCF RESTful API (硬编码配置)
    使用edge浏览器时,怎么让alt+tab不切换他的子标签页而只在程序间切换?
    C#.NET Winform使用线程承载WCF (硬编码配置)
    AnkhSVN For Visual Studio 2022
    ASP.NET MVC 查询加分页
    C#.NET Winform承载WCF RESTful API (App.config 方式)
    C#.NET Windows服务承载WCF
  • 原文地址:https://www.cnblogs.com/little-monkey/p/7197731.html
Copyright © 2020-2023  润新知