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 }
  • 相关阅读:
    bzoj 1017 魔兽地图DotR
    poj 1322 chocolate
    bzoj 1045 糖果传递
    poj 3067 japan
    timus 1109 Conference(二分图匹配)
    URAL 1205 By the Underground or by Foot?(SPFA)
    URAL 1242 Werewolf(DFS)
    timus 1033 Labyrinth(BFS)
    URAL 1208 Legendary Teams Contest(DFS)
    URAL 1930 Ivan's Car(BFS)
  • 原文地址:https://www.cnblogs.com/Long-w/p/9662628.html
Copyright © 2011-2022 走看看