2016-01-09 97 views
1

我想衡量亮度值。圖像處理:亮度加權

實施例: 我有亮度值的矢量:

vector <int> lum {50,100,150,200,250); 

我有係數的向量:

vector <float> coef {5.1 , 2.55 , 1.7 , 1.275, 1.02 } 

我創建一個空的圖像:

Mat1 m(15): 

所以,我的第一個亮度值是50(lum [0] = 50),我希望它應用在5.1(coef [0] = 5.1)f我矩陣的第一個像素。要做到這一點,我需要用第一個和第二個亮度值來加權第六個像素。在我的情況下,我的第6個像素的亮度將爲95,因爲(0.1 * 50)+(0.9 * 100)= 95現在,對於第二個係數(coef [1] = 2.55)以前的計算在2.55上使用了0.9。該係數仍爲1,65,因此第7個像素將具有100個亮度,並且第8個將具有(0.65 * 100)+(0.35 * 150)= 117,5。

等等......

Actualy我有這樣的:

//Blibliothèque Opencv 
#include "opencv2/core/core.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include "opencv2/imgcodecs.hpp" 
#include "opencv2/highgui/highgui.hpp" 
// cpp include 
#include <iostream> 
#include <cmath> 
#include <math.h> 
#include <string.h> 
#include <vector> 
#include <opencv2/opencv.hpp> 

#define MPI 3.14159265358979323846264338327950288419716939937510 
#define RAD2DEG (180./MPI) 

using namespace cv; 
using namespace std; 


vector <int> lum{ 50, 100, 150, 200, 250 }; 
vector <float> coef (5,0); 
vector <int> newv(15, 0); 
float pixelRef = 255, angle = 0, coeff = 0; 


int main() 
{ 


    for (int n = 0; n < lum.size(); ++n) 
    { 
     //get angle 
     angle = ((acos(lum[n]/pixelRef))); 
     cout << "angle :" << angle*RAD2DEG << endl; 
     // get coefficient 
     coef [n] = (1/(cos(angle))); 
     cout << "coeff :" << coef [n] << endl; 
     // try to weighted my pixels 
     newv[n] = (coef*lum[n]) + ((1 - coeff)*lum[n + 1]); 
    } 
    return 0; 
} 
+0

你嘗試過什麼到目前爲止?爲什麼圖像只有15個元素? – Miki

+0

不是,我鍵入了一些代碼,但它不起作用。 15只是一個例子,也許我應該使用矢量。 –

+0

請將您的代碼放入問題中。雖然我們在這裏提供幫助,但很高興看到您實際上嘗試了某些內容,而不是僅僅需要其他人爲您編寫代碼。 – Miki

回答

0

我修改的coef的最後一個元素3.02f表明,此代碼處理好也是最後一個元素。結果順序是:

50, 50, 50, 50, 50, 95, 100, 117.5, 150, 182.5, 218.75, 250, 250, 

enter image description here

的代碼可以或許重新編寫好,但我會離開這個給你:

#include <opencv2/opencv.hpp> 
#include <vector> 
#include <iostream> 
using namespace cv; 
using namespace std; 

int main() 
{ 
    vector <int> lum{ 50, 100, 150, 200, 250 }; 
    vector <float> coef{ 5.1f, 2.55f, 1.7f, 1.275f, 3.02f }; 

    vector<float> v; 

    int idx_lum = 0; 
    int idx_coef = 0; 

    while (true) 
    { 
     int c = int(coef[idx_coef]); 
     for (int i = 0; i < c; ++i) 
     { 
      v.push_back(float(lum[idx_lum])); 
     } 

     float alpha = fmod(coef[idx_coef], 1.f); 
     float beta = 1.f - alpha; 

     v.push_back(alpha * lum[idx_lum] + beta * lum[idx_lum + 1]); 

     idx_lum++; 
     idx_coef++; 
     coef[idx_coef] = coef[idx_coef] - beta; 

     if (idx_lum >= lum.size() - 1 || idx_coef >= coef.size() - 1) 
     { 
      int cc = int(coef[idx_coef]); 
      for (int i = 0; i < cc; ++i) 
      { 
       v.push_back(float(lum[idx_lum])); 
      } 

      // Only if the last remainder is needed 
      //float alpha = fmod(coef[idx_coef], 1.f); 
      //v.push_back(alpha * lum[idx_lum]); 
      break; 
     } 
    } 

    // Print out the values 
    copy(v.begin(), v.end(), ostream_iterator<float>(cout, ", ")); 

    // Get a cv::Mat from the std::vector 
    Mat1f m = Mat1f(v).t(); 

    return 0; 
} 
+0

太棒了!完美!非常感謝你! –

+0

@GuillaumeAndreani很高興幫助。請記住接受答案。 – Miki