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 }
  • 相关阅读:
    Leetcode Unique Binary Search Trees
    Leetcode Decode Ways
    Leetcode Range Sum Query 2D
    Leetcode Range Sum Query
    Leetcode Swap Nodes in Pairs
    Leetcode Rotate Image
    Leetcode Game of Life
    Leetcode Set Matrix Zeroes
    Leetcode Linked List Cycle II
    CF1321A
  • 原文地址:https://www.cnblogs.com/Long-w/p/9662628.html
Copyright © 2011-2022 走看看