• (7)opencv图片内部的基本处理


    就是,给定我们一张图片,我们可以对图片的每一个像素的色彩进行处理

    比如,我们的原图是这个样子

    然后我首先将他变成灰度图(灰度图的行道是1,就是chanaual是1)

    然后,我又将灰色图片的黑白进行颠倒

    涉及的代码如下:

     1 #include<iostream>
     2 #include<opencv.hpp>
     3 
     4 using namespace std;
     5 using namespace cv;
     6 
     7 int main()
     8 {
     9 
    10     Mat sou;
    11     sou = imread("C:\Users\32829\Desktop\aa.jpg");
    12     if (sou.empty())
    13     {
    14         cout << "图像读入失败" << endl;
    15     }
    16     namedWindow("new");
    17     imshow("new", sou);
    18 
    19     Mat dst;
    20     //将原图改为灰度图,就是改变原图的色系
    21     cvtColor(sou, dst, CV_BGR2GRAY);
    22     namedWindow("old1");
    23     imshow("old1", dst);
    24 
    25     int height = dst.rows;//获取目标图的高度
    26     int weight = dst.cols;//获取目标图的宽度
    27 
    28     for (int row = 0; row < height; row++)
    29     {
    30         for (int col = 0; col < weight; col++)
    31         {
    32             int grey = dst.at<uchar>(row, col);//获取图片的每一个像素点
    33             dst.at<uchar>(row, col) = 255 - grey;//将像素点变成他的补
    34         }
    35     }
    36     namedWindow("old2");
    37     imshow("old2", dst);
    38 
    39 
    40     waitKey(0);
    41     return 1;
    42 }

    上面是一通道的图片修改,下面是三通道的修改

    原图和修改后的图片展示

     1 #include<iostream>
     2 #include<opencv.hpp>
     3 
     4 using namespace std;
     5 using namespace cv;
     6 
     7 int main()
     8 {
     9 
    10     Mat sou;
    11     sou = imread("C:\Users\32829\Desktop\aa.jpg");
    12     if (sou.empty())
    13     {
    14         cout << "图像读入失败" << endl;
    15     }
    16     namedWindow("new");
    17     imshow("new", sou);
    18 
    19     Mat dst;
    20     ////将原图改为灰度图,就是改变原图的色系
    21     //cvtColor(sou, dst, CV_BGR2GRAY);
    22     //namedWindow("old1");
    23     //imshow("old1", dst);
    24 
    25     //int height = dst.rows;//获取目标图的高度
    26     //int weight = dst.cols;//获取目标图的宽度
    27 
    28     //for (int row = 0; row < height; row++)
    29     //{
    30     //    for (int col = 0; col < weight; col++)
    31     //    {
    32     //        int grey = dst.at<uchar>(row, col);//获取图片的每一个像素点
    33     //        dst.at<uchar>(row, col) = 255 - grey;//将像素点变成他的补
    34     //    }
    35     //}
    36     //namedWindow("old2");
    37     //imshow("old2", dst);
    38 
    39     dst.create(sou.size(), sou.type());
    40     namedWindow("old2");
    41     imshow("old2", dst);
    42     int height = dst.rows;//获取目标图的高度
    43     int weight = dst.cols;//获取目标图的宽度
    44     int chan = dst.channels();
    45 
    46     for (int row = 0; row < height; row++)
    47     {
    48         for (int col = 0; col < weight; col++)
    49         {
    50             if (chan == 1)
    51             {
    52                 int grey = dst.at<uchar>(row, col);//获取图片的每一个像素点
    53                 dst.at<uchar>(row, col) = 255 - grey;//将像素点变成他的补
    54             }
    55             else if (chan==3){
    56                 int b=sou.at<Vec3b>(row,col)[0];//获取他的这个像素点的第一个值
    57                 int g = sou.at<Vec3b>(row, col)[1];//获取他的这个像素点的第二个值
    58                 int r = sou.at<Vec3b>(row, col)[2];//获取他的这个像素点的第三个值
    59                 //下面是修改像素值;
    60                 dst.at<Vec3b>(row, col)[0] = 255 - b;
    61                 dst.at<Vec3b>(row, col)[1] = 255 - g;
    62                 dst.at<Vec3b>(row, col)[2] = 255 - r;
    63             }
    64         }
    65     }
    66 
    67     namedWindow("old4");
    68     imshow("old4", dst);
    69 
    70 
    71     waitKey(0);
    72     return 1;
    73 }

    还有一个简单的方法:

    然后代码就是将上面的for循环给删了

     1 #include<iostream>
     2 #include<opencv.hpp>
     3 
     4 using namespace std;
     5 using namespace cv;
     6 
     7 int main()
     8 {
     9 
    10     Mat sou;
    11     sou = imread("C:\Users\32829\Desktop\aa.jpg");
    12     if (sou.empty())
    13     {
    14         cout << "图像读入失败" << endl;
    15     }
    16     namedWindow("new");
    17     imshow("new", sou);
    18 
    19     Mat dst;
    20 
    21     
    22 
    23     dst.create(sou.size(), sou.type());
    24     namedWindow("old2");
    25     imshow("old2", dst);
    26     int height = dst.rows;//获取目标图的高度
    27     int weight = dst.cols;//获取目标图的宽度
    28     int chan = dst.channels();
    29 
    30 /////////////////////////////////////////////////////////就加了这一行
    31     
    32     bitwise_not(sou, dst);
    33 
    34 ////////////////////////////////////////////////////////////////////
    35     namedWindow("old4");
    36     imshow("old4", dst);
    37 
    38 
    39     waitKey(0);
    40     return 1;
    41 }

    基础知识整理:

    ====================================================================

    ============================================================================

    =============================================================================

     ===========================================================================

  • 相关阅读:
    协程
    多进程
    多线程
    模块进阶
    内建函数
    内建属性
    属性property
    私有化
    深拷贝、浅拷贝
    ==、is
  • 原文地址:https://www.cnblogs.com/xiaoyoucai/p/10179376.html
Copyright © 2020-2023  润新知