c++に基づく画像の階調補正
画像の階調補正:
目的:画像を空間領域で増強する簡単で有効な方法である.
1)画像が不均一(例えば、画像の半分が暗い半辺が明るい)であり、画像を点毎に異なる程度の階調補正を行うことができ、画像を均一にすることを目的とする.
2)画像の一部又は全体の露出不足に対して階調補正を行い、画像の階調コントラストを増強する.
例:3*3テンプレート:
1/9*
1*
1
1
1
1
1
1
1
1
:原図中の*付き階調値と右下に隣接する8画素の階調値を加算し、求めた平均値(9で割る)を新図中のその点の階調値とする.
テンプレート演算は非常に大きく、1枚のN*Nの画像で、テンプレートが3*3であれば、9*(N-2)*(N-2)回の乗算(最後の行、最後の列はテンプレート操作を行わない)、8*(N-2)*(N-2)回の加算があります.
(N−2)*(N−2)回の除算となるため、時間的複雑度O(N*N)となる.そのため、テンプレートは通常大きすぎてはいけません.
2次元テンプレートを1次元テンプレートに変換し、演算法則を低減し、6(N−1)(N−2)+4(N−1)(N−2)+(N−2)(N−2)に改良することができる.
例:
目的:画像を空間領域で増強する簡単で有効な方法である.
1)画像が不均一(例えば、画像の半分が暗い半辺が明るい)であり、画像を点毎に異なる程度の階調補正を行うことができ、画像を均一にすることを目的とする.
2)画像の一部又は全体の露出不足に対して階調補正を行い、画像の階調コントラストを増強する.
例:3*3テンプレート:
1/9*
1*
1
1
1
1
1
1
1
1
:原図中の*付き階調値と右下に隣接する8画素の階調値を加算し、求めた平均値(9で割る)を新図中のその点の階調値とする.
テンプレート演算は非常に大きく、1枚のN*Nの画像で、テンプレートが3*3であれば、9*(N-2)*(N-2)回の乗算(最後の行、最後の列はテンプレート操作を行わない)、8*(N-2)*(N-2)回の加算があります.
(N−2)*(N−2)回の除算となるため、時間的複雑度O(N*N)となる.そのため、テンプレートは通常大きすぎてはいけません.
2次元テンプレートを1次元テンプレートに変換し、演算法則を低減し、6(N−1)(N−2)+4(N−1)(N−2)+(N−2)(N−2)に改良することができる.
例:
int iTempH; //
int iTempW; //
int iTempMX; // x
int iTempMY; //y
float *fpArray; //
float *fCoef; //
unsigned char *lpDst; //
float fResult; //
for(i=iTempMY;i<iTempMY+lHeight-iTempH+1;i++)// ( )
{
for(j=iTempMX;j<iTempMX+lWidth-iTempW+1;j++)// ( )
{
lpDst=(unsigned char*)lpNewDIBBits+lLineBytes*(lHeight-i-1)+j;// DIB i j
fResult=0;
for(k=0;k<iTempH;k++)
for(l=0;l<iTempW;l++)
{
//
lpSrc=(unsigned char*)lpDIBBits+lLineBytes*(lHeight-i-1+iTempMY-k)+j-iTempMX+1;
fResult+=(*lpSrc)*fpArray[k*iTempW+l];
}//for_l
fResult*=fCoef;//
fResult=(float)fabs(fResult);
if(fResuslt>255)//
*lpSrc=255;
else
*lpDst=(unsigned char)(fResult+0.5);
}//for_j
}//for_i