2015-09-14 101 views
0

這裏我使用直方圖均衡化來編碼增加亮度,但它會改變圖像的整體亮度。我需要指定位置的亮度。如何使用直方圖均衡化來增加指定圖像部分的亮度

#include "opencv2/highgui/highgui.hpp" 
#include "opencv2/imgproc/imgproc.hpp" 
#include <iostream> 
using namespace cv; 
using namespace std; 
int main(int argc, const char** argv { 
Mat img = imread("MyPic.JPG", CV_LOAD_IMAGE_COLOR); 
if (img.empty()) 
{ 
    cout << "Image cannot be loaded..!!" << endl; 
    return -1; 
} 
cvtColor(img, img, CV_BGR2GRAY); 
Mat img_hist_equalized; 
equalizeHist(img, img_hist_equalized); //equalize the histogram 
namedWindow("Original Image", CV_WINDOW_AUTOSIZE); 
namedWindow("Histogram Equalized", CV_WINDOW_AUTOSIZE); 
imshow("Original Image", img); 
imshow("Histogram Equalized", img_hist_equalized); 
waitKey(0); //wait for key press 
destroyAllWindows(); //destroy all open windows 
return 0;} 

輸入圖像: Input image:

輸出I得到: Output I gets:

但我期望輸出 But I need output

上面的代碼是基於直方圖Equalization.Is有任何其他方法是指在這裏指定。

回答

0

您的問題的答案是在該方法中,用於生成具有預期輸出的最後一個圖像。您使用過哪些圖形編輯器命令來生成此結果?只需用OpenCV重複一遍。

你可以嘗試這樣的事情:

  • 增加對比度,

  • 減少顏色數到4,

  • 由全黑更換所有三個 「近黑」 色,並用真正的白色替換一個「接近白色」的 。

你有這樣的事情(頂部圖像的第二步驟之後,底部圖像第三步後):

result

這是好足夠多的爲您的任務是什麼?你需要更好的質量嗎?無論如何,嘗試在編碼之前通過任何圖形編輯器處理您的圖像。只有當你明白了,你需要將哪些操作應用到你的圖像上,試着用OpenCV來實現它。

爲了更好地理解這個問題,讓我們看看你的初始圖像的直方圖:

histogram

我們可以看到,「預計黑」和「預期白」的顏色之間的差異是非常小的。更重要的是,在「白色圓圈」內部,我們可以看到具有「預期黑色」的像素。所以僅僅修改這個像素混合的直方圖是不夠的。我們需要分析每個像素的周圍環境(實際上,我是在第一步中完成的 - 當圖像的對比度增加時)。我們可以討論它的方法,但首先我們需要更多的信息和努力。托盤的編輯沒有環境的分析會給你奇怪的結果是這樣的:

enter image description here

所以,你需要打開任何圖形編輯器,找到方法來你的輸入轉換爲預期的輸出。