2013-07-23 1 views
0

A pris un exemple d'image d'opencv (cat.jpg). Pour réduire la luminosité à une zone particulière. voici le lien pour l'imagecomment réduire l'intensité lumineuse d'une image

http://tinypic.com/view.php?pic=2lnfx46&s=5

+1

Modification de la luminosité et de contraste tutoriel [cliquez ici] (http://docs.opencv.org/doc/tutorials/core/basic_linear_transform/basic_linear_transform.html). Si vous voulez changer seulement les points lumineux, vous avez besoin de quelque chose de plus sophistiqué: la segmentation, les zones de couleurs dominantes, etc. – William

Répondre

1

Voici une solution possible. Les points lumineux sont détectés en utilisant une opération de seuil simple. Ensuite, les points lumineux sont obscurcis en utilisant une transformation gamma. Le résultat semble légèrement meilleur, mais malheureusement, si les pixels de l'image sont exactement blancs, toutes les informations de pixels sont perdues et vous ne pourrez pas récupérer ces informations.

#include <opencv2/opencv.hpp> 
#include <iostream> 
#include <cfloat> 

int threshold = 200; 
double gammav = 3; 

int main(int argc, char** argv) 
{ 
    cv::Mat image,gray_image,bin_image; 

    // read image 
    cv::imread(argv[1]).convertTo(image,CV_32FC3); 

    // find bright spots with thresholding 
    cv::cvtColor(image, gray_image, CV_RGB2GRAY); 
    cv::threshold(gray_image, bin_image, threshold, 255,0); 

    // blur mask to smooth transitions 
    cv::GaussianBlur(bin_image, bin_image, cv::Size(21,21), 5); 

    // create 3 channel mask 
    std::vector<cv::Mat> channels; 
    channels.push_back(bin_image); 
    channels.push_back(bin_image); 
    channels.push_back(bin_image); 
    cv::Mat bin_image3; 
    cv::merge(channels,bin_image3); 

    // create darker version of the image using gamma correction 
    cv::Mat dark_image = image.clone(); 
    for(int y=0; y<dark_image.rows; y++) 
     for(int x=0; x<dark_image.cols; x++) 
     for(int c=0;c<3;c++) 
      dark_image.at<cv::Vec3f>(y,x)[c] = 255.0 * pow(dark_image.at<cv::Vec3f>(y,x)[c]/255.0,gammav); 

    // create final image 
    cv::Mat res_image = image.mul((255-bin_image3)/255.0) + dark_image.mul((bin_image3)/255.0); 


    cv::imshow("orig",image/255); 
    cv::imshow("dark",dark_image/255); 
    cv::imshow("bin",bin_image/255); 
    cv::imshow("res",res_image/255); 

    cv::waitKey(0); 
} 

enter image description here

+0

merci sietschie – user2551056

Questions connexes