zoukankan      html  css  js  c++  java
  • 8、【opencv入门】访问图像的像素

    一、动态地址访问

    【示例】

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

    二、通过指针访问图像的每个像素

    【示例】

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

    三、通过迭代器访问图像的每个像素

     1 Mat img = imread("1.png");
     2 Mat dst = img.clone();
     3 
     4 imshow("src", img);
     5 
     6 Mat <Vec3b>::iterator it = dst.begin<Vec3b>();//初始位置
     7 Mat <Vec3b>::iterator itend = dst.end<Vec3b>();//终止位置
     8 
     9 for(; it != itend; ++it)
    10 {
    11     (*it)[0] = 0;//蓝色通道
    12     (*it)[1] = 255;//绿色通道
    13     (*it)[2] = 0;//红色通道
    14 }
    15 
    16 imshow("dst", dst);
    17 waitKey(0);
    18 destroyAllWindows();

    【示例】

     1 //通过迭代器范围图像的每个像素
     2 #include <opencv2/opencv.hpp>
     3 #include<iostream>
     4 
     5 using namespace cv;
     6 using namespace std;
     7 
     8 int main(){
     9     Mat img=imread("green.png");
    10     imshow("src",img);
    11     Mat dst=img.clone();
    12     Mat_<Vec3b>::iterator it = dst.begin<Vec3b>();//初始位置
    13     Mat_<Vec3b>::iterator itend = dst.end<Vec3b>();//终止位置
    14 
    15     for(; it != itend; ++it)
    16     {
    17         (*it)[0] = 0;//蓝色通道
    18         (*it)[1] = 255;//绿色通道
    19         (*it)[2] = 255;//红色通道
    20     }
    21     imshow("dst",dst);
    22     waitKey(0);
    23     return 0;
    24 }

    四、减色效果(通过指针访问图像的每个像素)

    【示例】

     1 //减色效果
     2 
     3 #include <opencv2/core/core.hpp>
     4 #include <opencv2/highgui/highgui.hpp>
     5 #include <opencv2/imgproc/imgproc.hpp>
     6 #include <iostream>
     7 
     8 using namespace std;
     9 using namespace cv;
    10 
    11 int main()
    12 {
    13     Mat img=imread("green.png");
    14     imshow("src",img);
    15     Mat dst=img.clone();
    16     int rowNumber=img.rows;
    17     int colNumber=img.cols*img.channels();//获取每一行的元素
    18     for(int i=0;i<rowNumber;i++){
    19         uchar* data=dst.ptr<uchar>(i);//获取每一行首地址
    20         for (int j = 0; j <colNumber; j++)
    21         {
    22             switch (j%3)
    23             {
    24             case 0://蓝色通道
    25                 data[j]=data[j]/4+64/2;
    26                 break;
    27             case 1://绿色通道
    28                 data[j]=data[j]/4+64/2;
    29                 break;
    30             case 2://红色通道
    31                 data[j]=data[j]/4+64/2;
    32                 break;
    33             }
    34         }
    35     }
    36     imshow("dst",dst);
    37     waitKey(0);
    38 }
    1 减色原理   data[j]=data[j]/64*64+64/2  可参考http://blog.csdn.net/lanchunhui/article/details/51167153

    五、随机产生椒盐噪声

    【示例】

     1 //随机产生椒盐噪声
     2 //通过动态地址访问图像的每个像素
     3 #include <opencv2/opencv.hpp>
     4 #include<iostream>
     5 
     6 using namespace cv;
     7 using namespace std;
     8 
     9 int main(){
    10     Mat img=imread("1.jpg");
    11     imshow("src",img);
    12     Mat dst=img.clone();
    13     int rowNumber=img.rows;
    14     int colNumber=img.cols;
    15     int i,j;
    16     for (int k = 0; k < 400; k++)//产生噪声的个数(此时为400)
    17     {
    18         i=rand()%rowNumber;//任意数对行数取余
    19         j=rand()%colNumber;//任意数对列数取余
    20         dst.at<Vec3b>(i,j)[0]=255;
    21         dst.at<Vec3b>(i,j)[1]=255;
    22         dst.at<Vec3b>(i,j)[2]=255;//将这三行的“255”设置为“0”即产生椒噪声
    23     }
    24     imshow("dst",dst);
    25     waitKey(0);
    26     return 0;
    27 }
  • 相关阅读:
    【Spark】通过创建DataFrame读取不同类型文件内容
    【Spark】Spark任务调度相关知识
    【Spark】RDD的依赖关系和缓存相关知识点
    【Spark】如何用Spark查询IP地址?
    【Spark】通过Spark实现点击流日志分析
    Spark离线日志分析,连接Spark出现报错
    【Scala】利用akka实现Spark启动通信
    【Scala】利用Akka的actor编程模型,实现2个进程间的通信
    【Scala】什么是隐式转换?它又能用来干嘛?该怎么用
    设计模式2-单例(多线程)
  • 原文地址:https://www.cnblogs.com/Long-w/p/9662628.html
Copyright © 2011-2022 走看看