图像处理---《读写图像、读写像素、修改像素值----灰度处理》

图像处理---《读写图像、读写像素、修改像素值----灰度处理》

 

/***************************************************************************************
作者:@WP20190612
环境:VS2010 + OpenCV2.4.3
功能:获取图像的灰度图,方式:
      (1)cvtColor()
      (2)gray_src.at<uchar>(row, col)=min(b,min(g,r));
      (3)gray_src.at<uchar>(row, col)=max(b,max(g,r));
***************************************************************************************/
//-------------------------------功能:制作 灰度图像------------------------------
#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>

using namespace cv;
using namespace std;

int main (int argc, char** argv)  //argumentss 参数;argc命令行参数个数;
{
    Mat src;
    src = imread("D:\\003_test_img\\test001.png");
    if (src.empty())
    {
        cout << "could not load image ...\n" << endl;
        return -1;   //return 0 成功完成本函数;return -1 未能完成本函数
    }
    namedWindow("input image", CV_WINDOW_AUTOSIZE);
    imshow("input image", src);
    
    //*******************************开始写函数,进行功能处理*************
    //**************************处理单通道的*******************************
    Mat gray_src;
    cvtColor(src, gray_src, CV_BGR2GRAY);
    namedWindow("output_gray_src", CV_WINDOW_AUTOSIZE);
    imshow("output_gray_src",gray_src);
    
    //图像的宽、高
    int height = gray_src.rows;
    int width  = gray_src.cols;

    //图像进行反色处理---单通道
    for (int row=0; row<height; row++)
    {
        for (int col=0; col<width; col++)
        {
            int gray=gray_src.at<uchar>(row, col);
            gray_src.at<uchar>(row, col)=255-gray;
        }
    }

    //显示处理后的图像
    //namedWindow("gray_invert", CV_WINDOW_AUTOSIZE);
    //imshow("gray_invert", gray_src);

    //**************************处理多通道************************************
    Mat dst;
    //cvtColor(src, gray_src, CV_BGR2GRAY);
    dst.create(src.size(), src.type());

    height = src.rows;
    width  = src.cols;
    int nc=src.channels();

    for (int row=0; row<height; row++)
    {
        for(int col=0; col<width; col++)
        {
            if (nc==1)
            {
                int gray = gray_src.at<uchar>(row, col);
                gray_src.at<uchar>(row, col)=255-gray;
            }
            else if (nc==3)
            {
                int b=src.at<Vec3b>(row, col)[0];
                int g=src.at<Vec3b>(row, col)[1];
                int r=src.at<Vec3b>(row, col)[2];

                //取反色处理
                //dst.at<Vec3b>(row, col)[0]=255-b;
                //dst.at<Vec3b>(row, col)[1]=255-g;
                //dst.at<Vec3b>(row, col)[2]=255-r;
                dst.at<Vec3b>(row, col)[0]=b;
                dst.at<Vec3b>(row, col)[1]=g;
                dst.at<Vec3b>(row, col)[2]=r;

                //其它方式的取灰度
                //gray_src.at<uchar>(row, col)=min(b,min(g,r));
                gray_src.at<uchar>(row, col)=max(b,max(g,r));
            }
        }
    }

    namedWindow("output_gray_max", CV_WINDOW_AUTOSIZE);
    imshow("output_gray_max", gray_src);
    //****************************处理多通道************************************
    //----------------------------结束处理图像---------------------------------------

    waitKey(0); //防止DOS一闪而过
    return 0;
}

posted on 2019-06-17 09:07  WP的烂笔头  阅读(888)  评论(0编辑  收藏  举报