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)に改良することができる.
例:
                    
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