精华内容
下载资源
问答
  • Python实现GIMP色彩增强插件,主要在CMYK,BGR和HSV颜色空间进行处理。
  • 前言 这是一个增强图像色彩的demo,基于...色彩增强 1.代码 void colorEnhancement(cv::Mat &src, cv::Mat &dst, int filter) { cv::Mat orig_img = src.clone(); cv::Mat simg; if (orig_img.channe...

    前言

    这是一个增强图像色彩的demo,基于OpenCV,能很好的增强与锐化图像中的色彩。

    色彩增强

    1.代码

    void colorEnhancement(cv::Mat &src, cv::Mat &dst, int filter)
    {
    
    	cv::Mat orig_img = src.clone();
        cv::Mat simg;
    
    	if (orig_img.channels() != 1)
    	{
    		cvtColor(orig_img, simg, CV_BGR2GRAY);
    	}
    	else
    	{
    		return;
    	}
        
        long int N = simg.rows*simg.cols;
    
        int histo_b[256];
        int histo_g[256];
        int histo_r[256];
    
        for(int i=0; i<256; i++)
    	{
            histo_b[i] = 0;
            histo_g[i] = 0;
            histo_r[i] = 0;
        }
        cv::Vec3b intensity;
    
        for(int i=0; i<simg.rows; i++)
    	{
            for(int j=0; j<simg.cols; j++)
    		{
                intensity = orig_img.at<cv::Vec3b>(i,j);
               
                histo_b[intensity.val[0]] = histo_b[intensity.val[0]] + 1;
                histo_g[intensity.val[1]] = histo_g[intensity.val[1]] + 1;
                histo_r[intensity.val[2]] = histo_r[intensity.val[2]] + 1;
            }
        }
    
        for(int i = 1; i<256; i++)
    	{
            histo_b[i] = histo_b[i] + filter * histo_b[i-1];
            histo_g[i] = histo_g[i] + filter * histo_g[i-1];
            histo_r[i] = histo_r[i] + filter * histo_r[i-1];
        }
    
        int vmin_b=0;
        int vmin_g=0;
        int vmin_r=0;
        int s1 = 3;
        int s2 = 3;
    
        while(histo_b[vmin_b+1] <= N*s1/100)
    	{
            vmin_b = vmin_b +1;
        }
        while(histo_g[vmin_g+1] <= N*s1/100)
    	{
            vmin_g = vmin_g +1;
        }
        while(histo_r[vmin_r+1] <= N*s1/100)
    	{
            vmin_r = vmin_r +1;
        }
    
        int vmax_b = 255-1;
        int vmax_g = 255-1;
        int vmax_r = 255-1;
    
        while(histo_b[vmax_b-1]>(N-((N/100)*s2)))
        {   
            vmax_b = vmax_b-1;
        }
        if(vmax_b < 255-1)
    	{
            vmax_b = vmax_b+1;
        }
        while(histo_g[vmax_g-1]>(N-((N/100)*s2)))
        {   
            vmax_g = vmax_g-1;
        }
        if(vmax_g < 255-1)
    	{
            vmax_g = vmax_g+1;
        }
        while(histo_r[vmax_r-1]>(N-((N/100)*s2)))
        {   
            vmax_r = vmax_r-1;
        }
        if(vmax_r < 255-1)
    	{
            vmax_r = vmax_r+1;
        }
    
        for(int i=0; i<simg.rows; i++)
        {
            for(int j=0; j<simg.cols; j++)
            {
               
                intensity = orig_img.at<cv::Vec3b>(i,j);
    
                if(intensity.val[0]<vmin_b)
    			{
                    intensity.val[0] = vmin_b;
                }
                if(intensity.val[0]>vmax_b)
    			{
                    intensity.val[0]=vmax_b;
                }
    
    
                if(intensity.val[1]<vmin_g)
    			{
                    intensity.val[1] = vmin_g;
                }
                if(intensity.val[1]>vmax_g)
    			{
                    intensity.val[1]=vmax_g;
                }
    
                if(intensity.val[2]<vmin_r)
    			{
                    intensity.val[2] = vmin_r;
                }
                if(intensity.val[2]>vmax_r)
    			{
                    intensity.val[2]=vmax_r;
                }
    
    			orig_img.at<cv::Vec3b>(i,j) = intensity;
            }
        }
    
        for(int i=0; i<simg.rows; i++)
    	{
            for(int j=0; j<simg.cols; j++)
    		{
               
                intensity = orig_img.at<cv::Vec3b>(i,j);
                intensity.val[0] = (intensity.val[0] - vmin_b)*255/(vmax_b-vmin_b);
                intensity.val[1] = (intensity.val[1] - vmin_g)*255/(vmax_g-vmin_g);
                intensity.val[2] = (intensity.val[2] - vmin_r)*255/(vmax_r-vmin_r);
    			orig_img.at<cv::Vec3b>(i,j) = intensity;
            }
        }   
        
        
        cv::Mat blurred;
    	double sigma = 1;
    	double threshold = 50;
    	double amount = 1;
        GaussianBlur(orig_img, blurred, cv::Size(), sigma, sigma);
        cv::Mat lowContrastMask = abs(orig_img - blurred) < threshold;
        cv::Mat sharpened = orig_img*(1+amount) + blurred*(-amount);
    	orig_img.copyTo(sharpened, lowContrastMask);
    	dst = sharpened.clone();
    }
    
    

    2.运行效果
    在这里插入图片描述

    展开全文
  • 利用matlab进行图形图像处理,可以实现把灰暗图片的色彩提亮,增强图片色彩效果和饱和度,将主体从背景凸显出来。
  • 多尺度高斯模型的图像色彩增强Matlab代买,对于大雾天气下可以实现透雾。并且对于阴影下可以使得图像细节也变得清晰,效果挺不错,不过对于视频序列效率不足。
  • ENVI5.1图像配准、融合、真色彩增强
  • 采用增强网络的色彩增强算法 1. 算法来源 本文介绍的算法来自于此篇paper: 《Distort-and-Recover: Color Enhancement using Deep Reinforcement Learning》 Jongchan Park, Joon-Young Lee, DonggeunYoo, and...

     

    采用增强网络的色彩增强算法

    1.      算法来源

    本文介绍的算法来自于此篇paper:

    《Distort-and-Recover: Color Enhancement using Deep Reinforcement Learning》

    Jongchan Park, Joon-Young Lee, DonggeunYoo, and In So Kweon

     

    本文是对此paper的一个学习总结,感兴趣的同学可以阅读原文获得最准确的知识。

     

    2.      简要介绍

    本文提出了一种图像增强方式,模拟艺术家调色的方式来增强图像,文中提出了2个大的可以借鉴的地方:

    1.         采用DQN决策每一步需要进行的基础图像操作算子;

    2.         训练数据采用从高质量图片构建输入-输出pairs.

     

    3.      详细介绍

    3.1 整体框架

     

     

    3.2 一个典型的调色过程

     

    3.3 基础图像操作算子

     

    3.3.1  对比度增强

    其中是对比度强度,I是输入图像(RGB格式),mean是图像的均值。

     

    3.3.2  饱和度增强

    O= α*I+(1-α)*mean(I(RGB))

    其中α是对比度强度,I是输入图像(RGB格式),mean单像素(R|G|B)三个值得均值,大小为图像大小,也就是说,每个像素点的均值不同,由此点的R|G|B值决定。

     

    3.3.3  亮度增强

    O= α*I+(1-α)*Zero(I)

    其中α是对比度强度,I是输入图像(RGB格式),Zero是图像大小的0值。

     

    3.3.4  白平衡(7--12)

    其中是对应R\G\B 值的调整项,I是对应的通道,这儿白平衡,是对三通道综合调整的一个结果。

     

    3.4 DQN输入(特征)

    3.4.1  ColorHistogram

    颜色特征采用CIELab空间中的直方图统计,按照20的间隔统计到20x20x20 Lab的直方图特征。

     

     

    3.4.2  CNN (VGG-16)

    此网络是在ILSVRC 数据集训练好的网络,用以 1000 个类别的识别,本文取了第6层4096 全连接层的输出作为DQN的特征输入。

    http://www.cs.toronto.edu/~frossard/post/vgg16/

    See the source image

     

     

    最终输入DQN的特征是 4096 + 8000

     

    3.5 DQN网络

    本文采用Double Q-Learning的网络训练最佳的调整步骤。

    (Deep ReinforcementLearning: Q-Learning)

     

    本文中采用的DQN包含四层全连接层,不包含卷积层:

     

    fc

    fc

    fc

    fc

    4096

    4096

    512

    12

     

    最后的12对应于基础图像操作算子。

     

    3.5.1  代码中的网络

    代码中采用的是Dueling Network Architectures for Deep Reinforcement Learning中提出的网络。与上述介绍的Double Q 网络等价。

     

    3.6 Loss

     

     

    训练网络时,的值通过最小化输出与真实值之间的MSE来决策。

     

    双Q网络此文介绍比较清晰:

    https://www.jianshu.com/p/193ca0106aa5

     

    3.7 停止条件

    如果 , 则停止当前调整,进行下一批数据的训练。

     

    3.8 训练数据生成

    用高质量的原始图,随机采用基础图像操作算子,对原始图像失真,失真的图片作为输入,原始图像作为输出,生成训练数据。

    失真的图片与原始图片的MSE保持在 10 – 20之间。

     

    4.      读后感

    本文的处理方法可以应用到一切可以细分为子图像处理流程的过程中。

    1.         可以用以对比度提升的算法中。

    2.         可以采用真正收集到的输入-输出对,对网络进行训练。

     

    5.      相关代码

    https://github.com/Jongchan/DISTORT-AND-RECOVER-CVPR18

    展开全文
  • 本文来自:...而色彩增强的目的是为了使的原有的不饱和的色彩信息变得饱和、丰富起来。对应于Photoshop里面的“色相/饱和度”调节选项里面对饱和度的操作。色彩增强的过程,并不改变原有彩...

    本文来自:https://blog.csdn.net/u013626386/article/details/47831385

    彩增强不同于彩色图像增强,图像增强的一般处理方式为直方图均衡化等,目的是为了增强图像局部以及整体对比度。而色彩增强的目的是为了使的原有的不饱和的色彩信息变得饱和、丰富起来。对应于Photoshop里面的“色相/饱和度”调节选项里面对饱和度的操作。色彩增强的过程,并不改变原有彩色图像的颜色以及亮度信息。

        在我的色彩增强算法模块里面,始终只针对色彩饱和度(Saturation)信息做研究,调整。这样的话,那就不得不介绍HSV颜色空间了,H代表Hue(色彩),S代表Saturation(饱和度),V代表Value,也可用B表示(Brightness,明度),HSV空间也可称作HSB空间。

        HSV空间在wikipedia上的介绍,https://en.wikipedia.org/wiki/HSL_and_HSV 

        下面根据自己的理解介绍一下HSV空间,以及其各通道在Matlab和OpenCV中的不同。

        HSV的圆柱模型

        

        HSV的圆锥模型

        

        从上图可以看出,在HSV空间中,Hue通道的取值从0-360°变化时,颜色从红->黄->绿->青->蓝逐步变化。Saturation从0->1变化时,色彩逐渐加深变成纯色(pure)。Value值从0->1变化时,图像整体亮度增加,V值为0时,图像为全黑,V值为1时,图像为全白

        Matlab RGB色彩空间向HSV转换,采用函数rgb2hsv,转换后的hsv各通道的元素取值范围为[0,1];OpenCV中彩色图像向HSV空间中转换,cvtColor(src,srcHsv,CV_BGR2HSV),转换后H的取值范围为[0,180],S,V的取值范围为[0,255].

       下面介绍自己的算法处理思路,后面会给出完整的Matlab代码: 

       步骤一、给出一张原图src,用PS进行饱和度(Saturation)+40处理后另存为src_40;

       步骤二、将以上两张图像分别转换到hsv空间,提取出饱和度信息,分别为S,S_40;

       步骤三、统计饱和度增加40后,原色彩饱和度与饱和度增量之间的对应关系,即S -- (S_40-S);

       步骤四、对关系S -- (S_40-S)进行二次多项式曲线拟合,得到二次曲线f(x) = p1*x^2 + p2*x + p3;

       为什么是二次?1.对应关系呈现出抛物线形状;2.更高次曲线并没有明显改善拟合性能,且计算消耗会变高。

       步骤五、任意给定输出图像input,根据其色彩饱和度信息,即可进行色彩增强40处理,新的饱和度信息可以表示为S'(x) = S(x) + f(x),得到增强后的色彩信息后返回RGB图像输出;

       步骤六、分别对原图+20,+40,+60后进行饱和度信息统计,并得到相应拟合参数,设置为色彩增强的低、中、高三挡,在实际处理过程中,根据输入图像input自身色彩饱和度信息(均值)自适应选取相应参数进行色彩增强;

       步骤七、按需对某一单独颜色通道进行色彩增强处理,例如绿色范围为105°-135°,在对该范围进行增强的同时,还需对75°-105°,135°-165°进行一半强度的增强,这样才会保证色彩的连续性,不会出现色斑;

       步骤八、按需对色彩(Hue)进行转换;

       代码部分:第一部分用作估计拟合参数,在Curve fitting tool里面对X,Y进行拟合,得到曲线参数。

    [plain]  view plain  copy
    1. % Color Enhancement  
    2. clc,clear,close all  
    3. src1 = imread('src.bmp');  
    4. src2 = imread('src_40.bmp');  
    5.   
    6. src1_hsv = rgb2hsv(src1);  
    7. src2_hsv = rgb2hsv(src2);  
    8.   
    9. h1 = src1_hsv(:,:,1);  
    10. s1 = src1_hsv(:,:,2);  
    11. v1 = src1_hsv(:,:,3);  
    12.   
    13. h2 = src2_hsv(:,:,1);  
    14. s2 = src2_hsv(:,:,2);  
    15. v2 = src2_hsv(:,:,3);  
    16. %   
    17. meanS1 = mean(s1(:));  
    18. varS1  = std2(s1);   
    19. %   
    20. meanS2 = mean(s2(:));  
    21. varS2  = std2(s2);   
    22. %   
    23. deltaS = s2 - s1;  
    24. deltaV = v2 - v1;  
    25.   
    26. %% test1 : 观测“原饱和度-饱和度调整增量”的关系 saturation and delta saturation  
    27. figure;  
    28. oriS = zeros(101,2);  
    29. s3 = s1;  
    30. j = 1;  
    31. for i = 0: 0.01 : 1  
    32.     oriS(j,1) = i + 0.01;  
    33.     oriS(j,2) =  mean(deltaS(find(s1 > i & s1< i + 0.01)));  
    34.     j = j + 1;  
    35. end  
    36. X  = oriS(:,1);  
    37. Y  = oriS(:,2);  
    38. XX = oriS(:,1) * 255;  
    39. YY = oriS(:,2) * 255;  
    40. plot(XX,YY)  

       第二部分,对输入图像进行高、中、低三级自适应增强处理

    [html]  view plain  copy
    1. %% Color Enhancement Module -- Authored by HuangDao,08/17/2015  
    2. % functions: input a image of type BMP or PNG, the program will decide to  
    3. % do the Color Enhancement choice for you.There are four types of Enhanced  
    4. % intensity - 20,40,60,80.The larger number stands for stronger  
    5. % enhancement.  
    6. % And we can also choose the simple color channel(eg.R,G,B) to do the  
    7. % enhancement.There are also four different types of enhanced intensity.  
    8. %  
    9. % parameters table  
    10. %  ------------------------------------------------------------------------  
    11. % | Enhanced  |     MATLAB params             |      OpenCV params         |  
    12. % | intensity |p1        p2        p3         | p1        p2        p3     |  
    13. % | 20        |-0.1661   0.2639    -0.003626  |-0.0006512 0.2639    -0.9246|  
    14. % | 40        |-0.4025   0.6238    -0.0005937 |0.001578   0.6238    -0.1514|  
    15. % | 60        |1.332     1.473     -0.01155   |-0.005222  1.473     -2.946 |  
    16. % | 80        |-4.813    3.459     -0.004568  |-0.01887   3.459     -1.165 |  
    17. %  ------------------------------------------------------------------------  
    18.   
    19. clc; clear ;close all  
    20. % 载入文件夹  
    21. pathName = '.\';  
    22. fileType = '*.bmp';  
    23. files    = dir([pathName fileType]);  
    24. len      = length(files);  
    25.   
    26. for pic = 5%1:1:len  
    27.     srcName = files(pic).name;  
    28.     srcImg  = imread(srcName);  
    29.     srcHSV  = rgb2hsv(srcImg);  
    30.     srcH    = srcHSV(:,:,1);  
    31.     srcS    = srcHSV(:,:,2);  
    32.     srcV    = srcHSV(:,:,3);  
    33.     meanS   = mean(srcS(:));  
    34.     varS    = std2(srcS);  
    35.     %图像整体进行色彩增强处理  
    36.     if (meanS >= 0.5)  
    37.         p1 = 0;p2 = 0;p3 = 0;  
    38.     else if (meanS >= 0.35 && meanS < 0.5)  
    39.             p1 = -0.1661;p2 = 0.2639;p3 = -0.003626;  
    40.         else if (meanS >=0.2 && meanS <0.35)  
    41.                 p1 = -0.4025;p2 = 0.6238;p3 = -0.0005937;  
    42.             else  
    43.                 p1 = 1.332;p2 = 1.473;p3 = -0.01155;  
    44.             end  
    45.         end  
    46.     end  
    47.     dstS = srcS + p1*srcS.*srcS + p2*srcS + p3 ;  
    48.     dstHSV = srcHSV;  
    49.     dstHSV(:,:,2) = dstS;  
    50.     dstImg = hsv2rgb(dstHSV);  
    51.     figure;imshow(srcImg);  
    52.     figure;imshow(dstImg);  
    53.     %指定R,G,B通道进行色彩增强处理,红色范围([225-255]),绿色范围(75-[105-135]-165),蓝色范围([-15-15])  
    54.     p11 = -0.4025;p21 = 0.6238;p31 = -0.0005937;%周边杂色调整系数,40  
    55.     p12 = 1.332;  p22 = 1.473; p32 = -0.01155;  %纯色区域调整系数,60  
    56.     compHue = srcH;  
    57.     GcompS  = dstS;  
    58.     RcompS  = dstS;  
    59.     BcompS  = dstS;  
    60.     channel = 'B';  
    61.     switch channel  
    62.         case 'G'  
    63.             I1 = find(compHue > 0.2083 & compHue <0.2917);  
    64.             GcompS(I1) = dstS(I1) + dstS(I1).*dstS(I1)*p11 + dstS(I1)*p21 + p31;  
    65.             I2 = find(compHue >= 0.2917 & compHue <= 0.3750);  
    66.             GcompS(I2) = dstS(I2) + dstS(I2).*dstS(I2)*p12 + dstS(I2)*p22 + p32;  
    67.             I3 = find(compHue > 0.3750 & compHue <0.4583);  
    68.             GcompS(I3) = dstS(I3) + dstS(I3).*dstS(I3)*p11 + dstS(I3)*p21 + p31;  
    69.             compHSV = dstHSV;  
    70.             compHSV(:,:,2) = GcompS;  
    71.             dstImgG = hsv2rgb(compHSV);  
    72.             figure;imshow(dstImgG);  
    73.         case 'R'  
    74.             I1 = find(compHue > 0.875 & compHue <0.9583);  
    75.             RcompS(I1) = dstS(I1) + dstS(I1).*dstS(I1)*p11 + dstS(I1)*p21 + p31;  
    76.             I2 = find(compHue >= 0.9583 | compHue <= 0.0417);  
    77.             RcompS(I2) = dstS(I2) + dstS(I2).*dstS(I2)*p12 + dstS(I2)*p22 + p32;  
    78.             I3 = find(compHue > 0.0417 & compHue <0.125);  
    79.             RcompS(I3) = dstS(I3) + dstS(I3).*dstS(I3)*p11 + dstS(I3)*p21 + p31;  
    80.             compHSV = dstHSV;  
    81.             compHSV(:,:,2) = RcompS;  
    82.             dstImgR = hsv2rgb(compHSV);  
    83.             figure;imshow(dstImgR);  
    84.         case 'B'  
    85.             I1 = find(compHue > 0.5417 & compHue <0.625);  
    86.             BcompS(I1) = dstS(I1) + dstS(I1).*dstS(I1)*p11 + dstS(I1)*p21 + p31;  
    87.             I2 = find(compHue >= 0.625 & compHue <= 0.7083);  
    88.             BcompS(I2) = dstS(I2) + dstS(I2).*dstS(I2)*p12 + dstS(I2)*p22 + p32;  
    89.             I3 = find(compHue > 0.7083 & compHue <0.7917);  
    90.             BcompS(I3) = dstS(I3) + dstS(I3).*dstS(I3)*p11 + dstS(I3)*p21 + p31;  
    91.             compHSV = dstHSV;  
    92.             compHSV(:,:,2) = BcompS;  
    93.             dstImgB = hsv2rgb(compHSV);  
    94.             figure;imshow(dstImgB);  
    95.     end  
    96.     %进行R,G,B通道之间的互换  
    97.     convH = zeros(size(srcH,1),size(srcH,2)); %convert  
    98.     deltaHue = 240;  
    99.     switch deltaHue  
    100.         case 120  
    101.             disp('R -> G')  
    102.             convH = srcH + 1/3;  
    103.             convH(find(convH >= 1)) = convH(find(convH >= 1)) - 1;  
    104.         case 240  
    105.             disp('R -> B')  
    106.             convH = srcH + 2/3;  
    107.             convH(find(convH >= 1)) = convH(find(convH >= 1)) - 1;  
    108.     end  
    109.     convHSV = dstHSV;  
    110.     convHSV(:,:,1) = convH;  
    111.     convImg = hsv2rgb(convHSV);  
    112.     figure;imshow(convImg)  
    113.     pause();  
    114. end  


       添加OpenCV代码段:

    [cpp]  view plain  copy
    1. Mat srcHSV,sat,satAdj,dstMerge,dst;     //sat - saturation饱和度分量  
    2. Mat imageAwb = imread("m_ImageAwb.bmp");  
    3. vector<Mat> channels,channels1;  
    4. double p1,p2,p3;  
    5.   
    6. cvtColor(imageAwb,srcHSV,CV_BGR2HSV);  
    7. split(srcHSV,channels);  
    8. split(srcHSV,channels1);  
    9. sat = channels.at(1);  
    10. Scalar m = mean(sat);  
    11.   
    12. if (m(0) <= 51.5)                         
    13. {p1 = -0.002714 , p2 = 0.9498, p3 = -0.5073;  AfxMessageBox("High Color Enhancement!"); }//高  
    14. else if (m(0) > 38.5 && m(0) <= 89.5)    
    15. {p1 = -0.001578  , p2 = 0.6238, p3 = -0.1514;AfxMessageBox("Middle Color Enhancement!"); }//中  
    16. else if (m(0) > 89.5 && m(0) <=127.5)    
    17. {p1 = -0.0006512, p2 = 0.2639, p3 = -0.9246;AfxMessageBox("Low Color Enhancement!");}//低  
    18. else                                     
    19. {p1 = 0,p2 = 0,p3 =0;AfxMessageBox("No Color Enhancement!");}  
    20.   
    21. satAdj = sat;  
    22. for (int i = 0 ; i < sat.rows;i ++)  
    23. {  
    24.     for (int j = 0;j < sat.cols;j ++)  
    25.     {  
    26.         uchar val = sat.at<uchar>(i,j);  
    27.         satAdj.at<uchar>(i,j) = (val + p1 * val * val + p2 * val + p3) ;  
    28.     }  
    29. }  
    30.   
    31. channels1.at(1) = satAdj;  
    32. merge(channels1,dstMerge);  
    33. cvtColor(dstMerge,dst,CV_HSV2BGR);  
    34. imwrite("m_ImageCE.bmp",dst);  


       最后给出算法效果图:

    Group1.原图->增强后


    Group2.原图->R通道增强->颜色通道改变R2B


    Group3.原图->增强后->颜色通道改变R2B


    完!下篇讲Local Tone Mapping。


    展开全文
  • 色彩增强不同于彩色图像增强,图像增强的一般处理方式为直方图均衡化等,目的是为了增强图像局部以及整体对比度。而色彩增强的目的是为了使的原有的不饱和的色彩信息变得饱和、丰富起来。对应于Photoshop里面的...

        色彩增强不同于彩色图像增强,图像增强的一般处理方式为直方图均衡化等,目的是为了增强图像局部以及整体对比度。而色彩增强的目的是为了使的原有的不饱和的色彩信息变得饱和、丰富起来。对应于Photoshop里面的“色相/饱和度”调节选项里面对饱和度的操作。色彩增强的过程,并不改变原有彩色图像的颜色以及亮度信息。

        在我的色彩增强算法模块里面,始终只针对色彩饱和度(Saturation)信息做研究,调整。这样的话,那就不得不介绍HSV颜色空间了,H代表Hue(色彩),S代表Saturation(饱和度),V代表Value,也可用B表示(Brightness,明度),HSV空间也可称作HSB空间。

        HSV空间在wikipedia上的介绍,https://en.wikipedia.org/wiki/HSL_and_HSV 

        下面根据自己的理解介绍一下HSV空间,以及其各通道在Matlab和OpenCV中的不同。

        HSV的圆柱模型

        

        HSV的圆锥模型

        

        从上图可以看出,在HSV空间中,Hue通道的取值从0-360°变化时,颜色从红->黄->绿->青->蓝逐步变化。Saturation从0->1变化时,色彩逐渐加深变成纯色(pure)。Value值从0->1变化时,图像整体亮度增加,V值为0时,图像为全黑,V值为1时,图像为全白

        Matlab RGB色彩空间向HSV转换,采用函数rgb2hsv,转换后的hsv各通道的元素取值范围为[0,1];OpenCV中彩色图像向HSV空间中转换,cvtColor(src,srcHsv,CV_BGR2HSV),转换后H的取值范围为[0,180],S,V的取值范围为[0,255].

       下面介绍自己的算法处理思路,后面会给出完整的Matlab代码: 

       步骤一、给出一张原图src,用PS进行饱和度(Saturation)+40处理后另存为src_40;

       步骤二、将以上两张图像分别转换到hsv空间,提取出饱和度信息,分别为S,S_40;

       步骤三、统计饱和度增加40后,原色彩饱和度与饱和度增量之间的对应关系,即S -- (S_40-S);

       步骤四、对关系S -- (S_40-S)进行二次多项式曲线拟合,得到二次曲线f(x) = p1*x^2 + p2*x + p3;

       为什么是二次?1.对应关系呈现出抛物线形状;2.更高次曲线并没有明显改善拟合性能,且计算消耗会变高。

       步骤五、任意给定输出图像input,根据其色彩饱和度信息,即可进行色彩增强40处理,新的饱和度信息可以表示为S'(x) = S(x) + f(x),得到增强后的色彩信息后返回RGB图像输出;

       步骤六、分别对原图+20,+40,+60后进行饱和度信息统计,并得到相应拟合参数,设置为色彩增强的低、中、高三挡,在实际处理过程中,根据输入图像input自身色彩饱和度信息(均值)自适应选取相应参数进行色彩增强;

       步骤七、按需对某一单独颜色通道进行色彩增强处理,例如绿色范围为105°-135°,在对该范围进行增强的同时,还需对75°-105°,135°-165°进行一半强度的增强,这样才会保证色彩的连续性,不会出现色斑;

       步骤八、按需对色彩(Hue)进行转换;

       代码部分:第一部分用作估计拟合参数,在Curve fitting tool里面对X,Y进行拟合,得到曲线参数。

    % Color Enhancement
    clc,clear,close all
    src1 = imread('src.bmp');
    src2 = imread('src_40.bmp');
    
    src1_hsv = rgb2hsv(src1);
    src2_hsv = rgb2hsv(src2);
    
    h1 = src1_hsv(:,:,1);
    s1 = src1_hsv(:,:,2);
    v1 = src1_hsv(:,:,3);
    
    h2 = src2_hsv(:,:,1);
    s2 = src2_hsv(:,:,2);
    v2 = src2_hsv(:,:,3);
    % 
    meanS1 = mean(s1(:));
    varS1  = std2(s1); 
    % 
    meanS2 = mean(s2(:));
    varS2  = std2(s2); 
    % 
    deltaS = s2 - s1;
    deltaV = v2 - v1;
    
    %% test1 : 观测“原饱和度-饱和度调整增量”的关系 saturation and delta saturation
    figure;
    oriS = zeros(101,2);
    s3 = s1;
    j = 1;
    for i = 0: 0.01 : 1
        oriS(j,1) = i + 0.01;
        oriS(j,2) =  mean(deltaS(find(s1 > i & s1< i + 0.01)));
        j = j + 1;
    end
    X  = oriS(:,1);
    Y  = oriS(:,2);
    XX = oriS(:,1) * 255;
    YY = oriS(:,2) * 255;
    plot(XX,YY)

       第二部分,对输入图像进行高、中、低三级自适应增强处理

    %% Color Enhancement Module -- Authored by HuangDao,08/17/2015
    % functions: input a image of type BMP or PNG, the program will decide to
    % do the Color Enhancement choice for you.There are four types of Enhanced
    % intensity - 20,40,60,80.The larger number stands for stronger
    % enhancement.
    % And we can also choose the simple color channel(eg.R,G,B) to do the
    % enhancement.There are also four different types of enhanced intensity.
    %
    % parameters table
    %  ------------------------------------------------------------------------
    % | Enhanced  |     MATLAB params             |      OpenCV params         |
    % | intensity |p1        p2        p3         | p1        p2        p3     |
    % | 20        |-0.1661   0.2639    -0.003626  |-0.0006512 0.2639    -0.9246|
    % | 40        |-0.4025   0.6238    -0.0005937 |0.001578   0.6238    -0.1514|
    % | 60        |1.332     1.473     -0.01155   |-0.005222  1.473     -2.946 |
    % | 80        |-4.813    3.459     -0.004568  |-0.01887   3.459     -1.165 |
    %  ------------------------------------------------------------------------
    
    clc; clear ;close all
    % 载入文件夹
    pathName = '.\';
    fileType = '*.bmp';
    files    = dir([pathName fileType]);
    len      = length(files);
    
    for pic = 5%1:1:len
        srcName = files(pic).name;
        srcImg  = imread(srcName);
        srcHSV  = rgb2hsv(srcImg);
        srcH    = srcHSV(:,:,1);
        srcS    = srcHSV(:,:,2);
        srcV    = srcHSV(:,:,3);
        meanS   = mean(srcS(:));
        varS    = std2(srcS);
        %图像整体进行色彩增强处理
        if (meanS >= 0.5)
            p1 = 0;p2 = 0;p3 = 0;
        else if (meanS >= 0.35 && meanS < 0.5)
                p1 = -0.1661;p2 = 0.2639;p3 = -0.003626;
            else if (meanS >=0.2 && meanS <0.35)
                    p1 = -0.4025;p2 = 0.6238;p3 = -0.0005937;
                else
                    p1 = 1.332;p2 = 1.473;p3 = -0.01155;
                end
            end
        end
        dstS = srcS + p1*srcS.*srcS + p2*srcS + p3 ;
        dstHSV = srcHSV;
        dstHSV(:,:,2) = dstS;
        dstImg = hsv2rgb(dstHSV);
        figure;imshow(srcImg);
        figure;imshow(dstImg);
        %指定R,G,B通道进行色彩增强处理,红色范围([225-255]),绿色范围(75-[105-135]-165),蓝色范围([-15-15])
        p11 = -0.4025;p21 = 0.6238;p31 = -0.0005937;%周边杂色调整系数,40
        p12 = 1.332;  p22 = 1.473; p32 = -0.01155;  %纯色区域调整系数,60
        compHue = srcH;
        GcompS  = dstS;
        RcompS  = dstS;
        BcompS  = dstS;
        channel = 'B';
        switch channel
            case 'G'
                I1 = find(compHue > 0.2083 & compHue <0.2917);
                GcompS(I1) = dstS(I1) + dstS(I1).*dstS(I1)*p11 + dstS(I1)*p21 + p31;
                I2 = find(compHue >= 0.2917 & compHue <= 0.3750);
                GcompS(I2) = dstS(I2) + dstS(I2).*dstS(I2)*p12 + dstS(I2)*p22 + p32;
                I3 = find(compHue > 0.3750 & compHue <0.4583);
                GcompS(I3) = dstS(I3) + dstS(I3).*dstS(I3)*p11 + dstS(I3)*p21 + p31;
                compHSV = dstHSV;
                compHSV(:,:,2) = GcompS;
                dstImgG = hsv2rgb(compHSV);
                figure;imshow(dstImgG);
            case 'R'
                I1 = find(compHue > 0.875 & compHue <0.9583);
                RcompS(I1) = dstS(I1) + dstS(I1).*dstS(I1)*p11 + dstS(I1)*p21 + p31;
                I2 = find(compHue >= 0.9583 | compHue <= 0.0417);
                RcompS(I2) = dstS(I2) + dstS(I2).*dstS(I2)*p12 + dstS(I2)*p22 + p32;
                I3 = find(compHue > 0.0417 & compHue <0.125);
                RcompS(I3) = dstS(I3) + dstS(I3).*dstS(I3)*p11 + dstS(I3)*p21 + p31;
                compHSV = dstHSV;
                compHSV(:,:,2) = RcompS;
                dstImgR = hsv2rgb(compHSV);
                figure;imshow(dstImgR);
            case 'B'
                I1 = find(compHue > 0.5417 & compHue <0.625);
                BcompS(I1) = dstS(I1) + dstS(I1).*dstS(I1)*p11 + dstS(I1)*p21 + p31;
                I2 = find(compHue >= 0.625 & compHue <= 0.7083);
                BcompS(I2) = dstS(I2) + dstS(I2).*dstS(I2)*p12 + dstS(I2)*p22 + p32;
                I3 = find(compHue > 0.7083 & compHue <0.7917);
                BcompS(I3) = dstS(I3) + dstS(I3).*dstS(I3)*p11 + dstS(I3)*p21 + p31;
                compHSV = dstHSV;
                compHSV(:,:,2) = BcompS;
                dstImgB = hsv2rgb(compHSV);
                figure;imshow(dstImgB);
        end
        %进行R,G,B通道之间的互换
        convH = zeros(size(srcH,1),size(srcH,2)); %convert
        deltaHue = 240;
        switch deltaHue
            case 120
                disp('R -> G')
                convH = srcH + 1/3;
                convH(find(convH >= 1)) = convH(find(convH >= 1)) - 1;
            case 240
                disp('R -> B')
                convH = srcH + 2/3;
                convH(find(convH >= 1)) = convH(find(convH >= 1)) - 1;
        end
        convHSV = dstHSV;
        convHSV(:,:,1) = convH;
        convImg = hsv2rgb(convHSV);
        figure;imshow(convImg)
        pause();
    end


       添加OpenCV代码段:

    	Mat srcHSV,sat,satAdj,dstMerge,dst;     //sat - saturation饱和度分量
    	Mat imageAwb = imread("m_ImageAwb.bmp");
    	vector<Mat> channels,channels1;
    	double p1,p2,p3;
    
    	cvtColor(imageAwb,srcHSV,CV_BGR2HSV);
    	split(srcHSV,channels);
    	split(srcHSV,channels1);
    	sat = channels.at(1);
    	Scalar m = mean(sat);
    
    	if (m(0) <= 51.5)	                   
    	{p1 = -0.002714 , p2 = 0.9498, p3 = -0.5073;  AfxMessageBox("High Color Enhancement!"); }//高
    	else if (m(0) > 38.5 && m(0) <= 89.5)  
    	{p1 = -0.001578  , p2 = 0.6238, p3 = -0.1514;AfxMessageBox("Middle Color Enhancement!"); }//中
    	else if (m(0) > 89.5 && m(0) <=127.5)  
    	{p1 = -0.0006512, p2 = 0.2639, p3 = -0.9246;AfxMessageBox("Low Color Enhancement!");}//低
    	else                                   
    	{p1 = 0,p2 = 0,p3 =0;AfxMessageBox("No Color Enhancement!");}
    
    	satAdj = sat;
    	for (int i = 0 ; i < sat.rows;i ++)
    	{
    		for (int j = 0;j < sat.cols;j ++)
    		{
    			uchar val = sat.at<uchar>(i,j);
    			satAdj.at<uchar>(i,j) = (val + p1 * val * val + p2 * val + p3) ;
    		}
    	}
    
    	channels1.at(1) = satAdj;
    	merge(channels1,dstMerge);
    	cvtColor(dstMerge,dst,CV_HSV2BGR);
    	imwrite("m_ImageCE.bmp",dst);


       最后给出算法效果图:

    Group1.原图->增强后


    Group2.原图->R通道增强->颜色通道改变R2B


    Group3.原图->增强后->颜色通道改变R2B


    完!下篇讲Local Tone Mapping。

    展开全文
  • ACE(Automatic Color Enhancement),自动色彩增强算法,是一种对于彩色图像增强十分行之有效的方法。它的改进算法以及快速实现在文章Automatic Color Enhancement (ACE) and its Fast Implementation,2012中提出。 ...
  • 自己写的C#小程序实现图像模糊处理:1、高斯滤波;2、频域低通滤波法;3、中值滤波法;4、均值滤波;图像锐化处理:拉普拉斯锐化;图像增强:伪彩色增强
  • 图像数据增强--色彩增强--算法

    千次阅读 2019-01-22 15:25:55
    https://www.cnblogs.com/laumians-notes/p/8629396.html
  • 用于除雾,去模糊,去噪,去油,修复,色彩增强,增亮,超分辨率等的低级视觉动物园。 低视力 除雾 由...撰写。 去模糊 由...撰写。 去噪 由...撰写。 排空 由...撰写。 补漆 由...撰写。 色彩增强 由...撰写。 提亮...
  • Opencv学习笔记——图像伪色彩增强

    千次阅读 2019-10-21 13:42:12
    #伪色彩 image = cv.imread("test0.jpg") color_image = cv.applyColorMap(image, cv.COLORMAP_JET) cv.imshow("image", image) cv.imshow("color_image", color_image) cv.waitKey(0) cv.destroyAllWindows...
  • 针对静态的Bayer抖动算法会产生块状效应的缺陷,提出了随时间变换抖动矩阵的动态Bayer抖动算法。该改进算法主要根据人眼的视觉特性,对每帧视频图像套用轮换的Bayer抖动矩阵模板,通过多帧图像叠加,消除块状效应。...
  • 从昨天折腾到今天。再折腾下去我都要上主楼了 大致和灰度图均衡是一样的,主要是不能像平滑什么的直接对R,G,B三个分量进行。这样出来的图像时没法看的。因此我们要对亮度进行均衡。而HSI彩色空间中的分量I代表图像...
  • 图像色彩增强之python实现——MSR,MSRCR,MSRCP,autoMSRCR

    万次阅读 多人点赞 2019-03-04 08:35:52
    最近在做街景图象色彩校正方面的工作,对于过暗,过曝光,以及背光等现象,用过一些gamma校正以及其他的方法,最终选择基于Retinex原理的方法对这几种现象都有一定的增强效果。最开始的时候是基于Retinex的单尺度的...
  • 水下图像处理色彩增强(一)

    千次阅读 2020-02-26 20:20:45
    做了大概一个月,效果如下,技术栈采用的是Springboot+opencv,服务器是lunix 我将模块单独提出了出来,如果想要测试效果的话可以关注我的公众号:代码包工头,点击工作Demo实际测试效果 ...
  • 多种半色调处理算法的实现与讲解
  • https://blog.csdn.net/weixin_38285131/article/details/88097771
  • 色彩包括:基本、色调曲线和HSL调整。 1.基本 1.1选择预设 自定义----通过单击自定义下拉列表,可以指定将素材设置为默认、Bright明亮、Fade淡化、Natural自然或Vivid鲜艳。 1.2另存为预设 单击另存为预设,将...
  • 图像增强 色彩恢复retinex.m
  • Premiere色彩校正与增强高级教程 文件内包含 1.入门 2.技术准本 3.技术细节 4.高级教程
  • 通过显着性色彩转移增强个人照片
  • 黑白语言增强色彩空间论文.doc
  • 基于色彩空间融合的快速图像增强
  • 彩色图像色彩保持增强算法性能分析,任洁,刘岚,彩色图像增强可以改善图像视觉效果,增强感兴趣的信息,但处理后色彩保持是关键。本文分析了三种色彩保持的彩色图像增强推广型算
  • TI DLP技术在增强现实(AR)抬头显示(HUD)等汽车应用中越来越受欢迎,主要原因之一是其具有明亮鲜艳的色彩。为了更好地理解颜色在AR HUD中的作用(如图1所示),我先介绍一下色彩饱和度和色域的概念。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 25,612
精华内容 10,244
关键字:

色彩增强