图像处理---《读写图像、读写像素、修改像素值----反色处理》

图像处理---《读写图像、读写像素、修改像素值---反色处理》

学习:利用读写图像、读写像素、修改像素值,实现一个图像反色处理例子

读写图像

(1)imread 可以指定加载为灰度或者RGB图像。

(2)Imwrite 保存图像文件,类型由扩展名决定。

 

读写像素

(1)读一个GRAY像素点的像素值(CV_8UC1)

Scalar intensity = img.at<uchar>(y, x);

或者 Scalar intensity = img.at<uchar>(Point(x, y));

 

(2)读一个RGB像素点的像素值

Vec3f intensity = img.at<Vec3f>(y, x);

float blue = intensity.val[0];

float green = intensity.val[1];

float red = intensity.val[2];

 

修改像素值

(1)灰度图像

img.at<uchar>(y, x) = 128;

 

(2)RGB三通道图像

img.at<Vec3b>(y,x)[0]=128; // blue

img.at<Vec3b>(y,x)[1]=128; // green

img.at<Vec3b>(y,x)[2]=128; // red

 

(3)空白图像赋值

img = Scalar(0);

 

(4)ROI选择

Rect r(10, 10, 100, 100);

Mat smallImg = img(r);

 

Vec3bVec3F

Vec3b对应三通道的顺序是blue、green、red的uchar类型数据。

Vec3f对应三通道的float类型数据

把CV_8UC1转换到CV32F1实现如下:

src.convertTo(dst, CV_32F);

/***************************************************************************************
作者:@WP20190612
环境:VS2010 + OpenCV2.4.3
功能:利用读写图像、读写像素、修改像素值--->实现 自己写一个图像反色处理函数 的例子
***************************************************************************************/
//-------------------------------功能:自己写一个图像反色处理函数------------------------------
#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", CV_WINDOW_AUTOSIZE);
    imshow("output",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 gray_src, dst;
    dst.create(src.size(), src.type());
    int height = src.rows;
    int 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;
            }
        }
    }
    namedWindow("gray_3channels_invert", CV_WINDOW_AUTOSIZE);
    imshow("gray_3channels_invert", dst);
    //****************************处理多通道************************************
    //----------------------------结束处理图像---------------------------------------

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

/***************************************************************************************
作者:@WP20190612
环境:VS2010 + OpenCV2.4.3
功能:opencv自带的图像反色处理函数
***************************************************************************************/
//-------------------------------功能:opencv自带的bitwise_not()反色处理函数------------------------------
#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", CV_WINDOW_AUTOSIZE);
    imshow("output",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 gray_src, dst;
    dst.create(src.size(), src.type());
    int height = src.rows;
    int 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;
            }
        }
    }*/

    //OpenCV自带的颜色 反处理函数
    bitwise_not(src, dst);  //反位操作函数

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

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

 

猜你喜欢

转载自www.cnblogs.com/carle-09/p/11028233.html