zoukankan      html  css  js  c++  java
  • PS 图像调整算法——亮度调整

    这个算法是参考自 阿发伯 的博客,在此对 阿发伯 表示感谢,

    http://blog.csdn.net/maozefa


    亮度调整

    非线性亮度调整:

    对于R,G,B三个通道,每个通道增加相同的增量。

    线性亮度调整:

    利用HSL颜色空间,通过只对其L(亮度)部分调整,可达到图像亮度的线性调整。但是,RGB和HSL颜色空间的转换很繁琐,一般还需要浮点数的运算,不仅增加了代码的复杂度,更重要的是要逐点将RGB转换为HSL,然后确定新的L值,再将HSL转换为RGB,运行速度可想而知是很慢的。要想提高图像亮度线性调整的速度,应该从三方面考虑,一是变浮点运算为整数运算,二是只提取HSL的L部分进行调整,三是采用汇编代码,在Delphi中,当然是BASM。下面是按照这三方面考虑写的图像亮度线性调整代码:

    L := (Max(R, Max(G,B)) + Min(R, Min(G, B))) div 2;

    L没有采用通常的百分比表示,而是取值0 - 255,这样就不必要采用浮点数运算了。

    下面代码主要完成2个功能,一是用以前的L值与RGB分别求出其HSL的HS部分,其公式用Pascal表示为:

    if L > 128 then
    begin
      rHS := (R * 128 - (L - 128) * 256) div (256 - L);
      gHS := (G * 128 - (L - 128) * 256) div (256 - L);
      bHS := (B * 128 - (L - 128) * 256) div (256 - L);
    end else
    begin
      rHS := R * 128 div L;
      gHS := G * 128 div L;
      bHS := B * 128 div L;
    end;

    二是用新的L值(老的L值加需要调整的亮度值(0 - 255))和上面求出的HS值计算出新的

    RGB值,计算方法为:
    newL := L + Value - 128;
    if newL > 0 then
    begin
      newR := rHS + (256 - rHS) * newL div 128;
      newG := gHS + (256 - gHS) * newL div 128;
      newB := bHS + (256 - bHS) * newL div 128;
    else begin
      newR := rHS + rHS * newL div 128;
      newG := gHS + gHS * newL div 128;
      newB := bHS + bHS * newL div 128;
    end;

    如此,一个像素点的线性亮度调整就基本完成了


    Program:

    clc;
    clear all;
    close all;
    Image=imread('4.jpg');
    Image=double(Image);
    R=Image(:,:,1);
    G=Image(:,:,2);
    B=Image(:,:,3);
    %%%% 求出原始图像亮度分量
    I=(R+G+B)/3;
    %%% 利用原始图像的亮度分量结合R,G,B求出HSL空间的H,S;
    rHS=R;
    gHS=G;
    bHS=B;
    [row, col]=size(I);
    for i=1:row
        for j=1:col
            if(I(i,j)>128)
                rHS(i,j)=(R(i,j)*128-(I(i,j)-128)*256)/(256-I(i,j));
                gHS(i,j)=(G(i,j)*128-(I(i,j)-128)*256)/(256-I(i,j));
                bHS(i,j)=(B(i,j)*128-(I(i,j)-128)*256)/(256-I(i,j));
            else
                rHS(i,j)=R(i,j)*128/(I(i,j));
                gHS(i,j)=G(i,j)*128/(I(i,j));
                bHS(i,j)=B(i,j)*128/(I(i,j));
            end
        end
    end
    %%%% 然后求出新的亮度值
    %%%% Increment: 亮度的调整增量(-255,255)

    Increment=-100;
    I_out=I+Increment-128;
    %%%% 再利用新的亮度值结合H,S,求出新的R,G,B分量
    R_new=R;
    G_new=G;
    B_new=B;
    for i=1:row
        for j=1:col
            if(I_out(i,j)>0)
                R_new(i,j)=rHS(i,j)+(256-rHS(i,j))*I_out(i,j)/128;
                G_new(i,j)=gHS(i,j)+(256-gHS(i,j))*I_out(i,j)/128;
                B_new(i,j)=bHS(i,j)+(256-bHS(i,j))*I_out(i,j)/128;
            else
                R_new(i,j)=rHS(i,j)+rHS(i,j)*I_out(i,j)/128;
                G_new(i,j)=gHS(i,j)+gHS(i,j)*I_out(i,j)/128;
                B_new(i,j)=bHS(i,j)+bHS(i,j)*I_out(i,j)/128;
            end
        end
    end
    Image_new(:,:,1)=R_new;
    Image_new(:,:,2)=G_new;
    Image_new(:,:,3)=B_new;
    imshow(Image/255);
    figure, imshow(Image_new/255);

  • 相关阅读:
    软件项目管理阅读笔记02
    大二下周总结(11)
    “帮你APP”团队冲刺9
    “帮你APP”团队冲刺8
    “帮你APP”团队冲刺7
    “帮你APP”团队冲刺6
    “帮你APP”团队冲刺5
    单词统计
    “帮你APP”团队冲刺4
    “帮你APP”团队冲刺3
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9412726.html
Copyright © 2011-2022 走看看