*딱히 어디서 펌했다고 하긴 그렇구.... 인터넷 여기저기서 주워담은 자료로......
[개론]
Thresholding이란 gray영상에서 어떤 경계값을 기준으로 0,1 두가지로 분류하는 것을 말한다.
첨부한 스샷을 보면 지도영상을 흑백변환하여 경계값을 적당히 조절하니 이미지에서 거의 글자만 남게되었다.
이와같이 여러가지 영상처리하는데 쓰이는 기초기술 중의 하나인것 같다.
(저도 잘 모름)
[수식표현]
if ( gray(x,y) > thVal )
t(x,y) = highColor;
else
t(x,y) = lowColor ;
[구현]
//---------------------------------------------------------------------------
void __fastcall TForm1::GrayChange() // 흑백 영상 변환
{
Graphics::TBitmap *bmp=new Graphics::TBitmap;
bmp->Width=Image1->Width;
bmp->Height=Image1->Height;
bmp->Assign(Image1->Picture->Bitmap);
bmp->PixelFormat=pf32bit;
unsigned char *cpt;
unsigned char tmp;
for(int h=0;hHeight;h++)
{
cpt=(unsigned char *)bmp->ScanLine[h];
for(int w=0;wWidth;w++)
{
tmp=(cpt[0]+cpt[1]+cpt[2])/3; //방법1
cpt[0]=tmp;
cpt[1]=tmp;
cpt[2]=tmp;
cpt+=4;
}
}
Image2->Width=bmp->Width;
Image2->Height=bmp->Height;
Image2->Picture->Bitmap->Assign(bmp);
delete bmp;
}
//--------------------------------------------------------------------------
void __fastcall TForm1::ThreshildChange() // 경계값 적용
{
unsigned char cThVal=ScrollBar1->Position;
Graphics::TBitmap *bmp=new Graphics::TBitmap;
bmp->Width=Image2->Width;
bmp->Height=Image2->Height;
bmp->Assign(Image2->Picture->Bitmap);
bmp->PixelFormat=pf32bit;
unsigned char *cpt;
unsigned char cHighColor=255;
unsigned char cLowColor=0;
for(int h=0;hHeight;h++)
{
cpt=(unsigned char *)bmp->ScanLine[h];
for(int w=0;wWidth;w++)
{
cpt[0]=(cpt[0]>cThVal)?cHighColor:cLowColor;
cpt[1]=(cpt[1]>cThVal)?cHighColor:cLowColor;
cpt[2]=(cpt[2]>cThVal)?cHighColor:cLowColor;
cpt+=4;
}
}
Image3->Width=bmp->Width;
Image3->Height=bmp->Height;
Image3->Picture->Bitmap->Assign(bmp);
delete bmp;
}
//---------------------------------------------------------------------------
다음엔 히스토리그램을 한번 해 보겠습니다.
그럼...
|
Threshold 의 결과가 항상 이진 영상은 아니죠~
Threshold 기법에 따라 결과물도 Gray Level 일 수 있습니다.
아래는 OpenCV 에서 제공하는 Threshold Type 입니다.
threshold_type=CV_THRESH_BINARY:
dst(x,y) = max_value, if src(x,y)>threshold
0, otherwise
threshold_type=CV_THRESH_BINARY_INV:
dst(x,y) = 0, if src(x,y)>threshold
max_value, otherwise
threshold_type=CV_THRESH_TRUNC:
dst(x,y) = threshold, if src(x,y)>threshold
src(x,y), otherwise
threshold_type=CV_THRESH_TOZERO:
dst(x,y) = src(x,y), if (x,y)>threshold
0, otherwise
threshold_type=CV_THRESH_TOZERO_INV:
dst(x,y) = 0, if src(x,y)>threshold
src(x,y), otherwise