由于最近临近期末,老师留了几个题目,并且兴趣使然,选择学习一下使用python实现图像的处理。
在此,墙裂推荐一个b站的up:十四阿哥很nice
首先声明,学习内容目前均来自于此up,如有侵权,十分抱歉,私信我,及时删除。

先来讲一下——灰度变换。
灰度变换是指根据某种目标条件按一定变换关系逐点改变源图像中每一个像素灰度值的方法。目的是 为了改善画质,使图像的显示效果更加清晰。 图像的灰度变换处理是图像增强处理技术中的一种非常基础、直接的空间域图像处理方法,也是图像数字化软件和图像显示软件的一个重要组成部分。——来自百度百科
灰度变换应该是,图像处理领域非常常用的一种手段,并且也非常的简单。
在我的理解里,简单地说,就是讲改变图片中每个像素的亮暗程度来使得图片中某些细节更加突出,使得人们更容易对图片的信息进行有效地捕获。
在此,我们用先最简单的反色变换为例,进行讲解。顾名思义,反色变换就是讲每个像素的亮度对调,假使本来的灰度是0,那么处理后他的灰度就是255。(灰度范围为0-255)在这里插入图片描述

如图所示, 我们使用代码获取图片中的每个像素的原灰度值,再读取改图片灰度值之中的最大值作为“L”,通过减法运算后再将其输出即可实现反色变换。
下边来看代码

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
#读者在使用反色变换前请安装numpy库和pillow库


def image_inverse(x):#定义反色变换函数
    value_max = np.max(x)
    y = value_max - x
    return y

if __name__ == '__main__':
    gray_img = np.asarray(Image.open(r'D:\xxx\101.jpg').convert('L'))
    #Image.open是打开图片,变量为其地址,
    inv_img = image_inverse(gray_img) #将原图形作为矩阵传入函数中,进行反色变换

    fig = plt.figure()#绘图
    ax1 = fig.add_subplot(121)#解释一下121,第一个1是一行,2是是两列,第二个1是第一个图
    ax1.set_title('Orignal')
    ax1.imshow(gray_img, cmap='gray', vmin=0, vmax=255)

    ax2 = fig.add_subplot(122)
    ax2.set_title('Transform')
    ax2.imshow(inv_img, cmap='gray', vmin=0, vmax=255)

    plt.show()


附:convert函数的用法

我们来看下效果图
在这里插入图片描述

怎么样是不是非常的简单
好,恭喜你,学会了最简单的图像处理,hhhh撒花(也恭喜我,我也刚学会使用python处理图像,今天先学的python

好,我们继续往下学习,接下来是对数变换

在这里插入图片描述
这里加1的原因是因为,为了防止像素的灰度为0,从而导致其结果为负无穷而+1。
我们来举一个简单的例子来说明,对数变换的作用。

首先我们定义了一个两行两列的矩阵,假设其值为[[10, 150], [250, 25500]](其灰度范围为0-25500)
那么,将其量化到0-255的范围内,
10对应的是1
150对应的是2
250对应的是3
25500对应的是255
那么我们来看下效果图如何
在这里插入图片描述
我们可以看出,对于我们人眼来说,这个三个黑色简直一毛一样有没有,这个时候如果我们通过对数变换来压缩他们的差距,便可以使图像的对比度大大增强。
我们可以很容易算出
log(10) =2.3979
log(25500) = 10.1464
很明显我们可以看出其比例相比于之前要缩小很多,那么再进行0-255之内的灰度变换会变得更加具有对比度,我们来看下效果图

在这里插入图片描述
,这下相比于之前是不是变化更明显了,虽然右上角和左下角的差距还是有些小,但肉眼已经可以分辨了。
那么下边是对以上操作的代码实现

import numpy as np
import matplotlib.pyplot as plt


def set_chinese():#该函数主要实现对图片名称的汉化
    import matplotlib
    matplotlib.rcParams['font.sans-serif'] = ['SimHei']
    matplotlib.rcParams['axes.unicode_minus'] = False


def image_log(cnt):#很简单的对数变化运算
    return np.log(1 + cnt)


if __name__ == "__main__":
    set_chinese()

    x = np.array([[10, 150],
                  [250, 25500]])#先将原矩阵的数值写给变量x

    xx = image_log(x)#获取对数变换后的数值

    fig = plt.figure()
    ax1 = fig.add_subplot(121)
    ax1.set_title('对数变换前', fontsize=12)
    ax1.imshow(x, cmap='gray', vmin=0, vmax=25500)

    ax2 = fig.add_subplot(122)
    ax2.set_title('对数变换后', fontsize=12)
    ax2.imshow(xx, cmap='gray')

    plt.show()
    #然后绘图对比就可以啦

ok,恭喜大家成功学会对数变换,是不是很简单呀
如果你觉得有用的话麻烦点个赞呗,谢谢谢谢

图像处理真的很好玩,希望我可以学下去,不过在考研,时间不是很多。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐