OpenCV学习第五篇:图像操作

来源:互联网 发布:2012nba总决赛数据 编辑:程序博客网 时间:2024/06/05 17:29

1.读写图像
imread可以加载指定的RGB图像
imwrite保存图像文件,类型由扩展名决定
2.读写像素
int gray = dst.at(row,col)读取指定行列的像素值
这里是代码:

#include <opencv2/opencv.hpp>#include <iostream>#include <math.h>using namespace cv;using namespace std;int main(int argc, char** ragv) {    Mat src, dst;    src = imread("F:/识图/645-140GG51042.JPG");    if (src.empty())    {        cout << "could not image!" << endl;        return -1;    }    namedWindow("SRC", CV_WINDOW_AUTOSIZE);    imshow("SRC", src);    cvtColor(src, dst, CV_BGR2GRAY);    namedWindow("OUTPUT", CV_WINDOW_AUTOSIZE);    imshow("OUTPUT", dst);    int height = dst.rows;    int weidth = dst.cols;    for (int row = 0; row < height; row++) {        for (int col = 0; col < weidth; col++)        {            //获取这个位置的像素            int gray = dst.at<uchar>(row, col);            //反向            dst.at<uchar>(row, col) = 255 - gray;        }    }    namedWindow("FAN", CV_WINDOW_AUTOSIZE);    imshow("FAN", dst);    waitKey(0);    return 0;}

效果如下:
这里写图片描述
3.Vec3b里面存储的B,G,R的值
Vec3f对应的float类型的数据
把CV_8UC1转换到CV32F1实现如下:
src.convertTo(dst,CV_32F);
完整代码:

#include <opencv2/opencv.hpp>#include <iostream>#include <math.h>using namespace cv;using namespace std;int main(int argc, char** ragv) {    Mat src, dst;    src = imread("F:/识图/645-140GG51042.JPG");    if (src.empty())    {        cout << "could not image!" << endl;        return -1;    }    namedWindow("SRC", CV_WINDOW_AUTOSIZE);    imshow("SRC", src);    cvtColor(src, dst, CV_BGR2GRAY);    namedWindow("OUTPUT", CV_WINDOW_AUTOSIZE);    imshow("OUTPUT", dst);    int height = dst.rows;    int weidth = dst.cols;    for (int row = 0; row < height; row++) {        for (int col = 0; col < weidth; col++)        {            //获取这个位置的像素            int gray = dst.at<uchar>(row, col);            //反向            dst.at<uchar>(row, col) = 255 - gray;        }    }    Mat drt_src;    drt_src.create(src.size(), src.type());    height = src.rows;    weidth = src.cols;    //获取通道数    int nc = src.channels();    //主要算法    for (int row = 0; row < height; row++) {        for (int col = 0; col < weidth; col++)        {            if (nc == 1) {                //获取这个位置的像素                int gray = dst.at<uchar>(row, col);                //反向                dst.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];                drt_src.at<Vec3b>(row, col)[0] = 255 - B;                drt_src.at<Vec3b>(row, col)[1] = 255 - G;                drt_src.at<Vec3b>(row, col)[2] = 255 - R;            }        }    }    //反差彩色图像快捷方式    bitwise_not(src, drt_src);    namedWindow("FAN", CV_WINDOW_AUTOSIZE);    imshow("FAN", drt_src);    waitKey(0);    return 0;}

实现效果:
这里写图片描述