CodeBlocks OPENCV 2.4.9 基本影像處理[彩色轉灰階(CB_OpenCV249_Rgb2Gray)]

CodeBlocks OPENCV 2.4.9 基本影像處理[彩色轉灰階(CB_OpenCV249_Rgb2Gray)]

CodeBlocks OPENCV 2.4.9 基本影像處理[彩色轉灰階(CB_OpenCV249_Rgb2Gray)]

資料來源:
https://cg2010studio.com/2011/06/06/opencv-%E8%BD%89%E6%8F%9B%E5%BD%B1%E5%83%8F%E7%82%BA%E7%81%B0%E9%9A%8E-transform-image-to-gray-level/
https://blog.csdn.net/kuweicai/article/details/73414138

https://cg2010studio.com/2013/03/22/opencv-iplimage-%E5%92%8C-mat-%E4%BA%92%E8%BD%89/


GITHUB:
    https://github.com/jash-git/CB_OpenCV249_Rgb2Gray

    
此範例是為了實現
    01.自己利用抓取像素方式撰寫彩色轉灰階 [IplImage]
    02.利用CV讀取影像彩色轉灰階 [Mat]
    03.比較上面兩種方法運算速度的差異
    04.IplImage 和 Mat 互轉
        // IplImage to Mat
        IplImage *img;     
        cv::Mat mat(img, 0);
         
        // Mat to IplImage
        cv::Mat mat;     
        IplImage *img = IplImage(mat);    

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/ml/ml.hpp>

#include <iostream>
#include <cstdio>

#include <sys/timeb.h>
#if defined(WIN32)
    #define  TIMEB    _timeb
    #define  ftime    _ftime
    typedef __int64 TIME_T;
#else
    #define TIMEB timeb
    typedef long long TIME_T;
#endif

using namespace cv;
using namespace std;
/*
資料來源:
[OpenCV] 轉換影像為灰階 (Transform Image to Gray Level)
https://blog.csdn.net/kuweicai/article/details/73414138
[OpenCV] IplImage 和 Mat 互轉
IplImage 和 Mat 互轉
    // IplImage to Mat
    IplImage *img;
    cv::Mat mat(img, 0);
    // Mat to IplImage
    cv::Mat mat;
    IplImage *img = IplImage(mat);
*/
void Pause()
{
    printf("Press Enter key to continue...");
    fgetc(stdin);
}
int main()
{
    //Image Size: 255x255// Image Size: 1000x669
    uchar Blue[256][256];//[669][1000];
    uchar Green[256][256];//[669][1000];
    uchar Red[256][256];//[669][1000];
    uchar Gray[256][256];//[669][1000];
    IplImage *Image1;
    Image1 = cvLoadImage("Lena_original.jpg",1);

    struct TIMEB ts1,ts2;
    TIME_T t1,t2;

    ftime(&ts1);//开始计时

    /* Load Image RGB Values */
    for(int i=0;i<Image1->height;i++){
        for(int j=0;j<Image1->widthStep;j=j+3){
            Blue[i][(int)(j/3)]=Image1->imageData[i*Image1->widthStep+j];
            Green[i][(int)(j/3)]=Image1->imageData[i*Image1->widthStep+j+1];
            Red[i][(int)(j/3)]=Image1->imageData[i*Image1->widthStep+j+2];
        }
    }

    /* Implement Algorithms */
    for(int i=0;i<Image1->height;i++){
        for(int j=0;j<Image1->width;j++){
            Gray[i][j]=(uchar)(0.299*Red[i][j] + 0.587*Green[i][j] + 0.114*Blue[i][j]);
            Red[i][j]=Gray[i][j];
            Green[i][j]=Gray[i][j];
            Blue[i][j]=Gray[i][j];
        }
    }

    /* Save Image RGB Values */
    for(int i=0;i<Image1->height;i++){
        for(int j=0;j<Image1->widthStep;j=j+3){
            Image1->imageData[i*Image1->widthStep+j]=Blue[i][(int)(j/3)];
            Image1->imageData[i*Image1->widthStep+j+1]=Green[i][(int)(j/3)];
            Image1->imageData[i*Image1->widthStep+j+2]=Red[i][(int)(j/3)];
        }
    }

    cvSaveImage("Lena_original_gray00.jpg",Image1);

    ftime(&ts2);//停止计时
    t1=(TIME_T)ts1.time*1000+ts1.millitm;
    t2=(TIME_T)ts2.time*1000+ts2.millitm;
    int t01=t2-t1;//获取时间间隔,ms为单位的
    cout<<t01<<"ms"<< endl;

    cvNamedWindow("Gray Level",1);
    cvShowImage("Gray Level",Image1);

    cvWaitKey(0);

    cvReleaseImage(&Image1);
    cvDestroyWindow("Gray Level");


    //-----------------------------

    cv::Mat src, gray;
    struct TIMEB ts3,ts4;
    TIME_T t3,t4;
    ftime(&ts3);//开始计时

	gray=cv::imread("Lena_original.jpg", cv::IMREAD_GRAYSCALE);//由imread()得到的灰度图像
    cv::imwrite("Lena_original_gray01.jpg",gray);

	ftime(&ts4);//停止计时
    t3=(TIME_T)ts3.time*1000+ts3.millitm;
    t4=(TIME_T)ts4.time*1000+ts4.millitm;
    int t02=t4-t3;//获取时间间隔,ms为单位的
    cout<<t02<<"ms"<< endl;

	src = cv::imread("Lena_original.jpg");
	cv::imshow("scr",src);
	cv::imshow("gray", gray);

    cvWaitKey(0);

    Pause();
    return 0;

}

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *