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

Posted zhangqixiang5449

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字图像的基本灰度变换函数相关的知识,希望对你有一定的参考价值。

图像反转,底片效果

反转灰度范围[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)

效果:


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

对数变换使灰度较低的区域对比度得到增强,或使灰度较高区域对比度增强(反对数变换),其公式与曲线:
s=c*log(1+r)

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的结果(灰度低的区域对比度增强)

注:《数字图像处理》书上的结果在c = 1时对比度高一些,可能因为印刷时经过提高对比度处理。


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

幂律(伽马)变换多用于伽马校正和对比度增强。
伽马校正:处理太亮或者太暗的图像,多用于屏幕上的精确校正。


伽马校正例子:

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')

结果:

对比度增强的例子:

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')

结果:


分段性变换函数

对比度拉伸
增强特定灰度区间的对比度。

c++代码:

#include "opCVHead.h"
#include <functional>
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; j<nl; j++)
            data = im.ptr<uchar>(j);
            for(int i = 0; i<nc; i++)
                data[i] = func(data[i]);
            
        

        imshow("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的灰度):

灰度级分层
突出某特定灰度区域。

理解较简单,代码难度小,不上代码了。
比特平面
比特平面是指将固定区间的灰度值分离出来。

理解较简单,代码难度小,不上代码了。

以上是关于数字图像的基本灰度变换函数的主要内容,如果未能解决你的问题,请参考以下文章

matlab 灰度变换函数

-灰度变换与空间滤波(空间域)

数字图像处理Python实现图像灰度变换、直方图均衡、均值滤波

数字图像处理 灰度变换与空域滤波

图像滤镜处理算法:灰度黑白底片浮雕

数字图像处理中,灰度的指数变换和对数变换分别有啥有