幂次变换的基本表达式为:y=cxr+b
其中c、r均为正数。与对数变换相同,幂次变换将部分灰度区域映射到更宽的区域中。当r=1时,幂次变换转变为线性变换。
(1) 当0<r<1时,变换函数曲线在正比函数上方。此时扩展低灰度级,压缩高灰度级,使图像变亮。这一点与对数变换十分相似。
(2) 当r>1时,变换函数曲线在正比函数下方。此时扩展高灰度级,压缩低灰度级,使图像变暗。
代码如下:
int PowerTrans(Mat & pSrc,double r,double b=0, double c=1) { //y=cxr+b // 映射表,用于256种灰度变换后的值 BYTE map[256]; // 保存运算后的临时值 double dTemp; for (int i = 0; i < 256; i++) { // 计算当前像素变换后的值 dTemp = c * pow(i / 255.0, r) * 255 + b; // 如果超界则修改其值 if (dTemp < 0) dTemp = 0.0; else if (dTemp > 255) dTemp = 255; // 四舍五入 map[i] = int(dTemp + 0.5); } int columns=pSrc.cols; int channels = pSrc.channels(); int count = 0; for(int i=0;i<pSrc.rows;i++) { uchar* p=pSrc.ptr(i);//获取Mat某一行的首地址 for(int j=0;j<columns*channels;j++) { *(p+j) = map[*(p+j)]; } } return 0; }
时间: 2024-10-05 05:04:44