欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

opencv笔记——图像操作

程序员文章站 2023-12-23 18:33:15
...

部分笔记参考自点击这里

  • 学习图像操作的原因:
    前面我们已经学习了通过指针来访问图像矩阵中的每一个元素,从而达到访问图像,对图像进行操作的目的,但是由于指针操作存在一定的危险性,可能会由于指针操作而指向系统关键的运行区域,从而导致出现程序系统崩溃,影响电脑等问题,因而我们还有必要学习其他的简单地、基本的、适合初学者的操作图像的办法。

  • 内容:
    具体内容为:对图像进行操作,首先要能够读写图像,然后要能够读写像素,最终目的是像素值修改

  • 读写图像用到的主要函数是:
    imread()可以指定加载为灰度或者RGB图像
    imwrite()可以用来保存图像文件,类型由扩展名决定

  • 读写像素:
    读一个灰度图像的像素的方法为:
    img.at(x,y);
    读一个三通道RGB图像像素的方法为:
    img.at(x,y)
    int b = img.at(x,y)[0];
    int g = img.at(x,y)[1];
    int r = img.at(x,y)[2];
    Vec3b代表的是三通道uchar型数据,
    Vec3f代表的是三通道float型数据。

下面通过代码来学习,实践出真知

#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main()
{
    Mat srcimage=imread("C:/Users/xihua/Pictures/Saved Pictures/opencv操作图/luosi.jpg");
    if(srcimage.empty()) {
        cout<<"could not load the image"<<endl; return -1;
    }
    else
    {
        namedWindow("原图");
        imshow("原图",srcimage);
    }
    /*通过像素指针读取图像像素*/
    Mat one_image=Mat::zeros(srcimage.size(),srcimage.type());
    int channels=srcimage.channels();
    cout<<"The channels of srcimage is:"<<channels<<endl;
    int cols=srcimage.cols*channels;
    int rows=srcimage.rows;
    for(int row=0;row<rows;row++) {
        const uchar* current=srcimage.ptr<uchar>(row);
        uchar* output=one_image.ptr<uchar>(row);
        for(int col=0;col<cols;col++) {
            output[col]=current[col];
        }
    }
    namedWindow("效果图");
    imshow("效果图",one_image);
    /*读取一个单通道灰色图像*/
    Mat two_image;
    cvtColor(srcimage,two_image,CV_BGR2GRAY);
    namedWindow("灰度图像");
    imshow("灰度图像",two_image);
    Mat three_image(two_image.size(),two_image.type());
    int two_channels=two_image.channels();
    cout<<"the channels of two_image is:"<<two_image.channels()<<endl;
    int two_cols = two_image.cols;
    int two_rows=two_image.rows;
    for(int row=0;row<two_rows;row++)
        for(int col=0;col<two_cols;col++) {
            const uchar current=two_image.at<uchar>(row,col);
        three_image.at<uchar>(row,col)=current;
        }
    namedWindow("单通道像素读取效果图");
    imshow("单通道像素读取效果图",three_image);
    /*取单通道反差图像*/
    Mat four_image(two_image.size(),two_image.type());
    for(int row=0;row<two_rows;row++)
    for(int col=0;col<two_cols;col++) {
        int xiangsu=two_image.at<uchar>(row,col);
            four_image.at<uchar>(row,col)=255-xiangsu;
    }
    namedWindow("取反差图像效果图");
    imshow("取反差图像效果图",four_image);
    /*读取BGR三通道图像并取反差效果*/;
    Mat five_image(srcimage.size(),srcimage.type());
    rows=srcimage.rows;
    cols=srcimage.cols;
    for(int row=0;row<rows;row++)
    for(int col=0;col<cols;col++) {
        int b=srcimage.at<Vec3b>(row,col)[0];//读取蓝色通道像素值
        int g=srcimage.at<Vec3b>(row,col)[1];//读取绿色通道像素值
        int r=srcimage.at<Vec3b>(row,col)[2];//读取红色通道像素值
        /*取反差值*/
        five_image.at<Vec3b>(row,col)[0]=255-b;
        five_image.at<Vec3b>(row,col)[1]=255-g;
        five_image.at<Vec3b>(row,col)[2]=255-r;
        }
        namedWindow("三通道图像取反差效果图");
        imshow("三通道图像取反差效果图",five_image);
    waitKey(0);
    return 0;
}

opencv笔记——图像操作
opencv笔记——图像操作
opencv笔记——图像操作
opencv笔记——图像操作
opencv笔记——图像操作
opencv笔记——图像操作

相关标签: opencv

上一篇:

下一篇: