理论基础:
对数变换的一般表达式为: t=c *log(1+s)
其中 c为尺度比例常数,s为原图灰度值,t 为变换后的目标灰度值。
对数变换示意图
有对数曲线可知,这种图像可以增强一幅图像中较暗部分的细节,从而可以用来扩展被压缩的高值图像中较暗像素,因此对数变换被广泛的应用于频谱图像的显示中。
代码如下:
void Ctry::OnTryTyr1()
{
//TODO: 在此添加命令处理程序代码
IplImage *img = cvLoadImage("C:\\Users\\Administrator\\Desktop\\55.jpg");
IplImage* r = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
IplImage* g = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
IplImage* b = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
cvSplit(img, r, g, b, NULL);
CvScalar pixel1;
double temp, temp1;
for (int i = 0; i < b->height - 1; ++i)
{
for (int j = 0; j < b->width - 1; ++j)
{
//pixel1 = cvGet2D(b, i, j);
temp1 = cvGet2D(b, i, j).val[0];
//对数变换
temp = 30 * log((double)(temp1 + 1));
cvSet2D(b, i, j, temp);
}
}
cvNamedWindow("bb", CV_WINDOW_AUTOSIZE);
cvShowImage("bb", b);
cvWaitKey(0);
cvReleaseImage(&img);
cvReleaseImage(&r);
cvReleaseImage(&g);
cvReleaseImage(&b);
}
对数后的图: