Opencv 如何降低图像的光照强度

Opencv 如何降低图像的光照强度,opencv,brightness,Opencv,Brightness,以opencv(cat.jpg)中的一幅图像为例,以降低特定区域的亮度。这是图片的链接 这里有一个可能的解决方案。使用简单的阈值操作检测亮点。然后使用伽马变换使亮点变暗。结果看起来稍微好一点,但不幸的是,如果图像中的像素完全是白色的,那么所有像素信息都将丢失,您将无法恢复这些信息 #include <opencv2/opencv.hpp> #include <iostream> #include <cfloat> int threshold = 200; d

以opencv(cat.jpg)中的一幅图像为例,以降低特定区域的亮度。这是图片的链接


这里有一个可能的解决方案。使用简单的阈值操作检测亮点。然后使用伽马变换使亮点变暗。结果看起来稍微好一点,但不幸的是,如果图像中的像素完全是白色的,那么所有像素信息都将丢失,您将无法恢复这些信息

#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);
}
#包括
#包括
#包括
int阈值=200;
双gammav=3;
int main(int argc,字符**argv)
{
cv::Mat图像、灰度图像、bin图像;
//读取图像
cv::imread(argv[1])。convertTo(图像,cv_32FC3);
//通过阈值化找到亮点
cv::CVT颜色(图像、灰度图像、cv\U RGB2GRAY);
cv::阈值(灰度图像,黑白图像,阈值,255,0);
//模糊遮罩以平滑过渡
cv::GaussianBlur(bin_图像,bin_图像,cv::Size(21,21),5);
//创建3通道掩码
矢量信道;
频道。推回(bin_图像);
频道。推回(bin_图像);
频道。推回(bin_图像);
cv::Mat bin_图像3;
cv::合并(通道,bin_图像3);
//使用gamma校正创建较暗版本的图像
cv::Mat dark_image=image.clone();

对于(int y=0;y这里有一个可能的解决方案。通过简单的阈值操作检测亮点。然后使用伽马变换将亮点变暗。结果看起来稍微好一点,但不幸的是,如果图像中的像素完全是白色的,所有像素信息都会丢失,您将无法恢复信息

#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);
}
#包括
#包括
#包括
int阈值=200;
双gammav=3;
int main(int argc,字符**argv)
{
cv::Mat图像、灰度图像、bin图像;
//读取图像
cv::imread(argv[1])。convertTo(图像,cv_32FC3);
//通过阈值化找到亮点
cv::CVT颜色(图像、灰度图像、cv\U RGB2GRAY);
cv::阈值(灰度图像,黑白图像,阈值,255,0);
//模糊遮罩以平滑过渡
cv::GaussianBlur(bin_图像,bin_图像,cv::Size(21,21),5);
//创建3通道掩码
矢量信道;
频道。推回(bin_图像);
频道。推回(bin_图像);
频道。推回(bin_图像);
cv::Mat bin_图像3;
cv::合并(通道,bin_图像3);
//使用gamma校正创建较暗版本的图像
cv::Mat dark_image=image.clone();

对于(int y=0;y更改亮度和对比度教程。如果只想更改亮点,则需要更复杂的内容:分割、主色区域等。更改亮度和对比度教程。如果只想更改亮点,则需要更复杂的内容:分割、主色区域等。