歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

OpenCV基礎篇之像素操作對比度調節

OpenCV基礎篇之像素操作對比度調節

程序及分析

/*
 * FileName : contrast.cpp
 * Author  : xiahouzuoxin @163.com
 * Version  : v1.0
 * Date    : Tue 29 Jul 2014 08:09:57 PM CST
 * Brief    :
 *
 * Copyright (C) MICL,USTB
 */
#include <cv.h>
#include <highgui.h>
#include <iostream>


using namespace cv;
using namespace std;

int main(int argc, char *argv[])
{
    float alpha = 0;
    int  beta  = 0;
    Mat  image;
    Mat  result;

    if (argc<2) {
        cout<<"Usage:./contrast [image_name]"<<endl;
        return -1;
    }

    image = imread(argv[1]);
    if (!image.data) {
        cout<<"Read image error."<<endl;
    }

    cout<<"Enter alpha value[1-3]:"<<endl;
    cin>>alpha;
    cout<<"Enter beta value[0-100]:"<<endl;
    cin>>beta;   

    result.create(image.size(), image.type());

    int n = image.rows * image.cols * image.channels();
    uchar *p = image.data;
    uchar *q = result.data;
    for (int i=0; i<n; i++) {
        *q++ = saturate_cast<uchar>(alpha * (*p++) + beta);   
    }

    namedWindow("origin", CV_WINDOW_AUTOSIZE);
    imshow("origin", image);
    namedWindow("result", CV_WINDOW_AUTOSIZE);
    imshow("result", result);

    waitKey(0);

    return 0;
}
 1.用到Mat::create成員方法用於對Mat對象的數據賦值
2.
saturate_cast在operations.hpp中定義和聲明,這裡的傳人參數為float類型,調用的是
template<> inline uchar saturate_cast<uchar>(float v)
{int iv = cvRound(v); return saturate_cast<uchar>(iv);}

 其中調用重載函數saturate_cast(int)完成,該函數的實現是:
template<> inline uchar saturate_cast<uchar>(int v)
{return (uchar)((unsigned)v <= UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0)}

 由於?:運算符是右結合特性,saturate_cast函數的作用就是:限制數據范圍為0~255,超過255的值取255,小於0的值取0

3.
像素操作:這裡沒有使用ptr指針(因為操作不用考慮像素的具體x、y坐標,是單像素到單像素的映射),當然使用ptr也可以。Mat的data成員是數據頭指針,程序通過指針*p與*q索引圖片中的元素進行操作賦值


效果

左邊為元素圖像,右邊為alpha=1,Beta=50時的增強亮度後的圖像。

--------------------------------------分割線 --------------------------------------

Ubuntu Linux下安裝OpenCV2.4.1所需包 http://www.linuxidc.com/Linux/2012-08/68184.htm

Ubuntu 12.04 安裝 OpenCV2.4.2 http://www.linuxidc.com/Linux/2012-09/70158.htm

CentOS下OpenCV無法讀取視頻文件 http://www.linuxidc.com/Linux/2011-07/39295.htm

Ubuntu 12.04下安裝OpenCV 2.4.5總結 http://www.linuxidc.com/Linux/2013-06/86704.htm

Ubuntu 10.04中安裝OpenCv2.1九步曲 http://www.linuxidc.com/Linux/2010-09/28678.htm

基於QT和OpenCV的人臉識別系統 http://www.linuxidc.com/Linux/2011-11/47806.htm

--------------------------------------分割線 --------------------------------------

Copyright © Linux教程網 All Rights Reserved