请问如何调整彩色图像的亮度对比度

cabbagebai 2001-08-29 08:51:06
我用RGB转换成HSI,然后对I做线形变换,
但失真的太厉害,请问有什么解决方法吗?
...全文
345 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
yphy 2002-07-08
  • 打赏
  • 举报
回复
同灰度图像一样,只不过三个通道而已.
shally5 2001-09-02
  • 打赏
  • 举报
回复

这个也许你有帮助。。。。。。

我在 Microsoft 出的一本書中看到關於 HSI 色碼(含 HSV、HSL 兩種系統)轉換成 RGB 色碼的程式,可是那個程式運算的速度實在太慢了,在許多需要作大量換算的場合中都會有很明顯的延遲,不知道有沒有速度更快的轉換程式?


2001-07-27 01:17 IP: 已記錄

martin

超級管理員
註冊時間: 2001年04月
發表文章數: 195
快一點的演算法??
書上教的應該就是標準演算法了
Source Code 都在手上了嗎?
丟上來讓大家看看
看看哪裡可以省掉不必要的時間...
很快救可以幫你解決了!
__________________
Best regards

Martin Hsiao

Email: martin@msws.idv.tw
Inside Out C++Builder http://insidebcb.copystar.com.tw
Open Source United Bulletin http://www.linuxshop.idv.tw/bulletin


2001-07-27 02:12 IP: 已記錄

Stargazer

初級成員
註冊時間: 2001年05月
發表文章數: 16
嗯,這個原始碼本來是用 VB 的語法寫成的,我自己把它轉換成 C++ 的語法,檔名為 HSI.H 如下:

#ifndef __HSI__
#define __HSI__

#include
#include

#define sngMaxOf(A,B) ((A)>(B)?(A):(B))
#define sngMinOf(A,B) ((A)<(B)?(A):(B))
#define RGB2HSL 1
#define HSL2RGB 2

class ColorHSL {
  private:
    long mlColor;
    int mR, mG, mB, mintCalc;
    float mH, mS, mI;
    void __fastcall letColor(long c) { mlColor=c; mR=mlColor&0xFF;
    mG=(mlColor%0x100)&0xFF; mB=(mlColor%0x10000)&0xFF; CalcHSL();}
    long __fastcall getColor() { if(mintCalc==RGB2HSL) CalcHSL();
    else CalcRGB(); return RGB(mR, mG, mB);}
    void __fastcall letH(float c) { mH=c; mintCalc=HSL2RGB;}
    float __fastcall getH() { if(mintCalc==RGB2HSL) CalcHSL(); return mH;}
    void __fastcall letS(float c) { mS=c; mintCalc=HSL2RGB;}
    float __fastcall getS() { if(mintCalc==RGB2HSL) CalcHSL(); return mS;}
    void __fastcall letI(float c) { mI=c; mintCalc=HSL2RGB;}
    float __fastcall getI() { if(mintCalc==RGB2HSL) CalcHSL(); return mI;}
    void CalcHSL() {
      float sngMx, sngMn, sngDelta, sngPctRed, sngPctGrn, sngPctBlu;
      sngPctRed=mR/255; sngPctGrn=mG/255; sngPctBlu=mB/255;
      sngMx=sngMaxOf(sngMaxOf(sngPctRed, sngPctGrn), sngPctBlu);
      sngMn=sngMinOf(sngMinOf(sngPctRed, sngPctGrn), sngPctBlu);
      sngDelta=sngMx-sngMn; mI=(sngMx+sngMn)/2; mS=sngMx!=sngMn;
      if(mI<=0.5) { if(mS>0) mS=sngDelta/(sngMx + sngMn);}
      else if(mS>0) mS=sngDelta/(2-sngMx-sngMn);
      if(mS) {
        if(sngPctRed==sngMx) mH=(sngPctGrn-sngPctBlu)/sngDelta;
        if(sngPctGrn==sngMx) mH=2+(sngPctBlu-sngPctRed)/sngDelta;
        if(sngPctBlu==sngMx) mH=4+(sngPctRed-sngPctGrn)/sngDelta;
        mH*=60;
      }
      if(mH<0) mH+=360;
      mintCalc=0;
    }
    void CalcRGB() {
      float sngM1, sngM2, sngPctRed, sngPctGrn, sngPctBlu;
      sngM2=(mI<=0.5)?mI*(1+mS):(mI+mS)-mI*mS;
      sngM1=2*mI-sngM2;
      if(mS==0) sngPctRed=sngPctGrn=sngPctBlu=mI;
      else {
        sngPctRed=rgbVal(sngM1, sngM2, mH+120);
        sngPctGrn=rgbVal(sngM1, sngM2, mH);
        sngPctBlu=rgbVal(sngM1, sngM2, mH-120);
      }
      mR = 255.9999*sngPctRed;
      mG = 255.9999*sngPctGrn;
      mB = 255.9999*sngPctBlu;
      mintCalc=0;
    }
    float rgbVal(float sngN1, float sngN2, float sngHue) {
      if(sngHue>360) sngHue-=360;
      else if(sngHue<0) sngHue+=360;
      if(sngHue<60) return sngN1+(sngN2-sngN1)*sngHue/60;
      else if(sngHue<180) return sngN2;
      else if(sngHue<240) return sngN1+(sngN2-sngN1)*(240-sngHue)/60;
      else return sngN1;
    }
  public:
    ColorHSL() { mlColor=0;}
    __property long Color={ write=letColor, read=getColor};
    __property float H={ write=letH, read=getH};
    __property float S={ write=letS, read=getS};
    __property float I={ write=letI, read=getI};
};

#endif

註:上面文字考慮顯示上的問題,縮排使用全形空白,若要測試時請注意。

[已被 Stargazer 編輯過,在 2001-07-27 21:48]


gqxs 2001-09-02
  • 打赏
  • 举报
回复
关注
cabbagebai 2001-09-02
  • 打赏
  • 举报
回复
up
cabbagebai 2001-09-01
  • 打赏
  • 举报
回复
那如何再把SrcP赋给一幅新图?
我用一个TrackBar做,在OnChange事件中响应,但对一幅200*300的图就速度很慢
请问是否有什么快一些的方法
还有对比度的情况用这种方法如何做?
cabbagebai 2001-08-31
  • 打赏
  • 举报
回复
你这个图象是对R,G,B为8位的
如果可能是5,8,10,12,16的,怎么办?
有没有什么简单的方法,因为我用一个点一个点算的方法似乎速度很慢
HEROIN 2001-08-30
  • 打赏
  • 举报
回复
唉,我看不懂
xycleo 2001-08-30
  • 打赏
  • 举报
回复
void __stdcall AdjustLightness(Graphics::TBitmap *Bmp,int Amount)
{
int x,y;
Byte Table[255];
TRGBColor24 *SrcP;

if( Amount>0) {
for(x=0;x<=255;x++) {
Table[x]=IntToByte(x+((Amount*(x^255))>>8));
}
}
else {
for(x=0;x<=255;x++) {
Table[x]=IntToByte(x-((abs(Amount)*x)>>8));
for(y=0;y<=Bmp->Height-1;y++) {
SrcP=static_cast<TRGBColor24 *>(Bmp->ScanLine[y]);
for(x=0;x<=Bmp->Width-1;x++) {
SrcP[x].R=Table[SrcP[x].R];
SrcP[x].G=Table[SrcP[x].G];
SrcP[x].B=Table[SrcP[x].B];
}
}
}
}
}
garypeng 2001-08-29
  • 打赏
  • 举报
回复
那有亮度和对比度的调整算法吗?
whitelion 2001-08-29
  • 打赏
  • 举报
回复
学习
sundayboys 2001-08-29
  • 打赏
  • 举报
回复
我有锐化图像的代码,你要吗?sundayboys@21cn.com

13,863

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧