OpenCV學習第五篇:圖像操作

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;
}

實現效果:
這裏寫圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章