对数变换的通用形式: S= C* LOG(1+ R)
(其中C是个常数,并设R>= 0)
下面介绍些要用的函数:
cvSet*D
修改指定的数组
void cvSet1D( CvArr* arr, int idx0, CvScalar value );
void cvSet2D( CvArr* arr, int idx0, int idx1, CvScalar value );
void cvSet3D( CvArr* arr, int idx0, int idx1, int idx2, CvScalar value );
void cvSetND( CvArr* arr, int* idx, CvScalar value );
arr
输入数组
idx0
元素下标的第一个成员,以0为基点
idx1
元素下标的第二个成员,以0为基点
idx2
元素下标的第三个成员,以0为基点
idx
元素下标数组
value
指派的值
函数 cvSet*D 指定新的值给指定的数组元素。对于稀疏矩阵如果指定节点不存在函数创建新的节点
CvScalar
可存放在1-,2-,3-,4-TUPLE类型的捆绑数据的容器
typedef struct CvScalar
{
double val[4];
}
CvScalar;
/* 构造函数:用val0初始化val[0]用val1初始化val[1], 以此类推*/
代码:
- // 对数变换.cpp : 定义控制台应用程序的入口点。
- //
- #include "stdafx.h"
- #include "opencv2/opencv.hpp"
- int _tmain(int argc, _TCHAR* argv[])
- {
- cvNamedWindow("Src", CV_WINDOW_AUTOSIZE);
- cvNamedWindow("Dst", CV_WINDOW_AUTOSIZE);
- IplImage* src= 0;
- CvScalar scalar;
- int i;
- int j;
- //加载图片
- src= cvLoadImage("F://Opencv_picture//1211.jpg", 0); // 这里要把图像强制转换为灰度图
- if(!src )
- {
- printf("Cannot not open this picture!\n");
- }
- //显示原图
- cvShowImage("Src", src);
- for(i=0; i< src->height; i++)
- {
- for(j=0; j< src->width; j++)
- {
- scalar= cvGet2D(src, i, j);
- scalar.val[0]=32* log10( scalar.val[0])/ log10(2.0);
- cvSet2D(src, i, j, scalar);
- }
- }
- //显示处理后的图片
- cvShowImage("Dst", src);
- cvWaitKey(0); // 暂停
- return 0;
- }
结果图:
PS:
src= cvLoadImage("F://Opencv_picture//1211.jpg", 0); // 这里要把图像强制转换
下面的是没有在CVLoadImage()中把第二个参数设置为0(即强制转换为灰度图)
结果图:
哎,处理后竟然变色了,和想要的结果不同。