1.对比度展宽
对图像灰度级进行重新映射,是一种线性变换。通过抑制非重要信息的对比度来腾出空间给重要信息进行对比度扩展。
2.灰度窗
舍弃某部分不重要的信息,将重要信息映射到0~255之间,常常用于医学图像处理,将肌肉、骨头分离。
3.灰度窗切片
选择灰度值在一定范围内的像素,设置为255,其他为0;
#ifndef HISTGORAM_H
#define HISTGORAM_H
#include <cv.h>
#include <highgui.h>
//对比度展宽,将灰度值重新映射
void contrast_ratio_extend(IplImage*
src, IplImage* dst, const double&
fa, const double&
fb,
const double &
ga, const double&
gb)
{
assert( src->nChannels == 1); //单通道无符号整型
double afa
= ga/fa;
double beta
= (gb - ga)/(fb - fa);
double gamma
= (255 - gb)/(255 - fa);
for (int y
= 0; y != src->height; ++y)
{
for (int x
= 0; x != src->width; ++x)
{
uchar* p = (uchar*)(src->imageData + y*src->widthStep + x);
uchar* q = (uchar*)(dst->imageData + y*dst->widthStep + x);
if (*p
>= 0 && *p < fa)
{
*q = (uchar)(afa*(*p));
}
else if (*p
>= fa && *p <fb)
{
*q = (uchar)(beta*(*p - fa) + ga);
}
else if (*p
>= fb && *p < 255)
{
*q = (uchar)(gamma*(*p - fb) + gb);
}
}
}
}
//灰度窗,将fa到fb之间的灰度值映射到0~255之间
void graylevel_window(IplImage*
src, IplImage* dst, const double&
fa, const double&
fb)
{
assert(src->nChannels == 1); //单通道无T符?号?整?型
//double
a = ga/fa;
double beta
= 255/(fb - fa);
//double
gamma = (255 - gb)/(255 - fa);
for (int y
= 0; y != src->height; ++y)
{
for (int x
= 0; x != src->width; ++x)
{
uchar* p = (uchar*)(src->imageData + y*src->widthStep + x);
uchar* q = (uchar*)(dst->imageData + y*dst->widthStep + x);
if (*p
>= 0 && *p < fa)
{
*q = 0;
}
else if (*p
>= fa && *p <fb)
{
*q = (uchar)(beta*(*p - fa));
}
else if (*p
>= fb && *p < 255)
{
*q = 255;
}
}
}
}
//灰度窗切D片,?即感兴趣的部分设置为255,其他部分为a0
void graylevel_slice(IplImage*
src, IplImage* dst, const double&
fa, const double&
fb) //0<fa<fb<255
{
assert(src->nChannels == 1 && fa > 0 && fa < fb && fb < 255);
double beta
= 255/(fb - fa);
//double
gamma = (255 - gb)/(255 - fa);
for (int y
= 0; y != src->height; ++y)
{
for (int x
= 0; x != src->width; ++x)
{
uchar* p = (uchar*)(src->imageData + y*src->widthStep + x);
uchar* q = (uchar*)(dst->imageData + y*dst->widthStep + x);
if (*p
>= fa && *p <fb)
{
*q = 255;
}
else
*q = 0;
}
}
}
#endif