图像反转:特别适用于处理增强嵌入在一幅图像的暗区域中的白色或灰色细节,特别是当黑色面积占主导地位时。
//s 输出灰度级 r输入灰度级
s = L -1 -r
对数变换:使范围较窄的低灰度值映射为较宽的灰度值,也即是扩展图像中的暗像素,压缩高灰度级的值。(这是由于对数函数的图像性质决定的)
//s 输出灰度级 r输入灰度级
// C 是一个常数
s = c log( 1+ r )
幂律(伽马)变换
gamma>1, 较亮的区域灰度被拉伸,较暗的区域灰度被压缩,图像整体变暗;
gamma<1, 较亮的区域灰度被压缩,较暗的区域灰度被拉伸,图像整体变亮;
//s 输出灰度级 r输入灰度级
// C 是一个常数
s = c * r^γ
对比度拉伸:实现特定灰度范围的对比度拉伸(需要4个参数)(a, b, c, d)
灰度级分层:突出图像中特定灰度范围的亮度通常是重要的,其应用包括增强特征
比特平面分层: 灰度图是一个由像素组成的矩阵,目前大部分的灰度图中的像素用1B存储即8bit,比特平面分层的意思是将所有像素的相同比特拿出来单独组成一个矩阵,这样就会有八个矩阵。根据冈萨雷斯的《数字图像处理》,高比特部分的图像所含信息量大,而低比特部分所含信息量少。比特平面分层对于以后指导图像压缩或者计算机视觉具有重要意义。
由于每个像素值是十进制数,由8bit组成,所有首先需要将每个像素值转换为对应的二进制数。例如,像素值128,对应的二进制数为1000 0000,那么从左至右,依次为该像素的第8bit、第7bit、第6bit…,对于一幅图像构成的矩阵也就对应着有8个bit矩阵,分别为第8bit平面、第7bit平面、第6bit平面…。
比特平面分层的目的就是将这8个bit平面分开,并显示观察每个平面所包含的信息。
/*bit平面分层*/
/*十进制数转二进制数*/
void num2Binary(int num, int b[8]){
int i;
for ( i = 0; i < 8; i++){
b[i] = 0;
}
i = 0;
while (num!=0){
b[i] = num % 2;
num = num / 2;
i++;
}
}
/***************************
num_bit - 指定bit平面
num_bit = 1~8
num_bit=1,即输出第1个Bit平面
****************************/
void Bitplane_stratification(cv::Mat& src,cv::Mat& B , int num_Bit){
int b[8];//8个二进制bit位
if (src.channels()>1)
cv::cvtColor(src, src, CV_RGB2GRAY);
B.create(src.size(), src.type());
for (int i = 0; i < src.rows; i++){
const uchar* ptr_src = src.ptr<uchar>(i);
uchar* ptr_B = B.ptr<uchar>(i);
for (int j = 0; j < src.cols; j++){
num2Binary(ptr_src[j], b);
ptr_B[j] = b[num_Bit - 1]*255; //0和1灰度差别太小,乘255便于视觉观察
}
}
}