2015-09-29 1 views
2

У меня есть два изображения. У одного есть более зеленый цвет, а другой - лучшего качества (он имеет правильный цвет). Как можно улучшить первый, чтобы иметь подобный цвет в качестве второго one.I использовали повышение контрастности, какУлучшение качества изображения в Opencv

//Contrast enhancement 
    for (int y = 0; y < rotated.rows; y++) 
    { 
     for (int x = 0; x < rotated.cols; x++) 
     { 
      for (int c = 0; c < 3; c++) 
      { 
       //"* Enter the alpha value [1.0-3.0]: " 
       //"* Enter the beta value [0-100]: "; 
       rotated.at<Vec3b>(y, x)[c] = 
        saturate_cast<uchar>(2.5*(rotated.at<Vec3b>(y, x)[c]) + 30); 
      } 
     } 
    } 

Это делает более ярким изображение. Но мне нравится иметь такой же цвет, как и второй. Каковы значения RGB для изменения цвета второго изображения. enter image description here enter image description here

ответ

1

Для усиления контраста можно использовать эквивалент Matlab imadjust. Вы можете найти реализацию OpenCV here.

Применение imadjust с параметрами по умолчанию на каждом отдельном канале вы получите:

enter image description here

Вот полный код:

#include <opencv2\opencv.hpp> 
#include <vector> 
#include <algorithm> 

using namespace std; 
using namespace cv; 

void imadjust(const Mat1b& src, Mat1b& dst, int tol = 1, Vec2i in = Vec2i(0, 255), Vec2i out = Vec2i(0, 255)) 
{ 
    // src : input CV_8UC1 image 
    // dst : output CV_8UC1 imge 
    // tol : tolerance, from 0 to 100. 
    // in : src image bounds 
    // out : dst image buonds 

    dst = src.clone(); 

    tol = max(0, min(100, tol)); 

    if (tol > 0) 
    { 
     // Compute in and out limits 

     // Histogram 
     vector<int> hist(256, 0); 
     for (int r = 0; r < src.rows; ++r) { 
      for (int c = 0; c < src.cols; ++c) { 
       hist[src(r, c)]++; 
      } 
     } 

     // Cumulative histogram 
     vector<int> cum = hist; 
     for (int i = 1; i < hist.size(); ++i) { 
      cum[i] = cum[i - 1] + hist[i]; 
     } 

     // Compute bounds 
     int total = src.rows * src.cols; 
     int low_bound = total * tol/100; 
     int upp_bound = total * (100 - tol)/100; 
     in[0] = distance(cum.begin(), lower_bound(cum.begin(), cum.end(), low_bound)); 
     in[1] = distance(cum.begin(), lower_bound(cum.begin(), cum.end(), upp_bound)); 

    } 

    // Stretching 
    float scale = float(out[1] - out[0])/float(in[1] - in[0]); 
    for (int r = 0; r < dst.rows; ++r) 
    { 
     for (int c = 0; c < dst.cols; ++c) 
     { 
      int vs = max(src(r, c) - in[0], 0); 
      int vd = min(int(vs * scale + 0.5f) + out[0], out[1]); 
      dst(r, c) = saturate_cast<uchar>(vd); 
     } 
    } 
} 

int main() 
{ 
    Mat3b img = imread("path_to_image"); 

    vector<Mat1b> planes; 
    split(img, planes); 

    for (int i = 0; i < 3; ++i) 
    { 
     imadjust(planes[i], planes[i]); 
    } 

    Mat3b result; 
    merge(planes, result); 

    return 0; 
} 
+0

Это может быть полезно предоставить информацию о том, как вы скомпилировать программу и на какой платформе вы находитесь, чтобы другие могли следовать ... просто мысль. –

+0

@MarkSetchell это программа на C++, связанная с OpenCV (как в вопросе). Независимо от того, какой компилятор ОС, IDE или C++ будет работать. Что-то мне не хватает? – Miki

+0

Все, что я предлагаю, это то, что ваш ответ может быть более полезным и, возможно, получить больше голосов, если он скажет * «Я на Ubuntu, и я скомпилирую с помощью' gcc -I-что-то -Dsomething -O2 -Lsomewhere -lopencv -lfunkylibXYZ' * * –

Смежные вопросы