数字图像的基本灰度变换函数

图像反转,底片效果

反转灰度范围[0,L-1]的图像需要使用L-1减去图像灰度值,公式:
s = L-1-r

matlab代码

>> gyy = imread('gyy.jpg');
>> L = uint8(255*ones(size(gyy)));
>> imshow(gyy);
>> figure,imshow(L-gyy)

效果:
数字图像的基本灰度变换函数_第1张图片


对数变换,增强灰度低区/高区对比度

对数变换使灰度较低的区域对比度得到增强,或使灰度较高区域对比度增强(反对数变换),其公式与曲线:
s=c*log(1+r)
数字图像的基本灰度变换函数_第2张图片

matlab代码:

f = rgb2gray(imread('DFT.png'));
fd = double(f);
c = 1;
s_1 = uint8(c*log2(1+fd));
c = 10;
s_2 = uint8(c*log2(1+fd));
c = 20;
s_3 = uint8(c*log2(1+fd));

figure(),imshow(f);
figure(),imshow(s_1);
figure(),imshow(s_2);
figure(),imshow(s_3);

结果:
从左到右依次是原图,c = 1,10,20的结果(灰度低的区域对比度增强)
数字图像的基本灰度变换函数_第3张图片
注:《数字图像处理》书上的结果在c = 1时对比度高一些,可能因为印刷时经过提高对比度处理。


幂律(伽马)变换,伽马校正/增强对比度

幂律(伽马)变换多用于伽马校正和对比度增强。
伽马校正:处理太亮或者太暗的图像,多用于屏幕上的精确校正。
这里写图片描述
数字图像的基本灰度变换函数_第4张图片
伽马校正例子:

gm = rgb2gray(imread('gm.png'));
gmd = double(gm);
c = 3;
r = 0.7;
s_1 = c*gmd.^(r);
>> imshow(gm);title('原图');
>> figure();imshow(uint8(s_1));title('c = 3, γ = 0.7')

结果:
数字图像的基本灰度变换函数_第5张图片

对比度增强的例子:

gyy = imread('gyy.jpg');
gyyd = double(gyy);
c = 0.8;
r = 1.2;
>> s = c*gyyd.^(r);
>> imshow(gyy);title('原图');
>> figure();imshow(uint8(s));title('c=0.8,γ=1.2')

结果:
数字图像的基本灰度变换函数_第6张图片


分段性变换函数

对比度拉伸
增强特定灰度区间的对比度。
数字图像的基本灰度变换函数_第7张图片
c++代码:

#include "opCVHead.h"
#include 
namespace contrastStretch{

    std::function<uchar(uchar)> getFunc(uchar point1_x,uchar point1_y,uchar point2_x,uchar point2_y);

    int contrastStretch(){
        auto im = imread("/Users/qixiangzhang/Desktop/dbdls.jpg");
        if(!im.data) return 0;

        imshow("Original", im);

        int nl = im.rows;
        int nc = im.cols*im.channels();

        auto func = getFunc(100, 20, 160, 230);
        uchar* data;

        for(int j = 0; juchar>(j);
            for(int i = 0; i"process",im);

        return 1;
    }

    std::function<uchar(uchar)> getFunc(uchar point1_x,uchar point1_y,uchar point2_x,uchar point2_y){

    if(point1_x > point2_x || point1_y > point2_y) return NULL;

    double k_1 = point1_y / point1_x;
    double k_2 = (point2_y - point1_y) / (point2_x - point1_x);
    double k_3 = (255 - point2_y)/(255 - point2_x);

    double b_2 = point1_y - k_2 * point1_x;
    double b_3 = point2_y - k_3 * point2_x;


    auto func = [=](uchar x) ->uchar{
        if (x < point1_x) return k_1*x;
        if (x > point2_x)return k_3*x + b_3;
        return k_2*x + b_2;
        };

    return func;

    }
};

结果(拉伸100-160的灰度):
数字图像的基本灰度变换函数_第8张图片

灰度级分层
突出某特定灰度区域。
数字图像的基本灰度变换函数_第9张图片
理解较简单,代码难度小,不上代码了。
比特平面
比特平面是指将固定区间的灰度值分离出来。
数字图像的基本灰度变换函数_第10张图片
理解较简单,代码难度小,不上代码了。

你可能感兴趣的:(数字图像处理)