IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> 图像线性拉伸Python使用公式 -> 正文阅读

[Python知识库]图像线性拉伸Python使用公式

1.框架构建

①先导入图像;

②把图像转为矩阵形式储存;

③然后通过函数调用,拿到图像灰度的最大和最小值;

④对图像进行处理,使用公式:

?

?

⑤把拉伸之后的矩阵转换为图像;

⑥显示原图和拉伸之后的图像。

2.调用的第三方库

本次图像线性拉伸的实践通过调用numpy、matplotlib、PIL(Python Image Library 的简称)。

①Numpy 是 Python 的一个第三方库,就是 Numerical Python 的意思。这是一个科学计算的的核心库,有着强大的多维数组对象。

Numpy 数组是一个功能强大的 N 维数组对象,它以行和列的形式存在,我们可以通过 Python 列表来初始化 Numpy 数组并访问其元素。

②PIL 库中提供了诸多用来处理图片的模块,可以对图片做类似于 PS(Photoshop) 的编辑。比如:改变图像大小、旋转图像、图像格式转换,转换颜色通道,图像增强,直方图处理,插值和滤波等等。

③Pyplot 是 Matplotlib 的子库,提供了和 MATLAB 类似的绘图 API。

Pyplot 是常用的绘图模块,能很方便让用户绘制 2D 图表。

Pyplot 包含一系列绘图函数的相关函数,每个函数会对当前的图像进行一些修改,例如:给图像加上标记,生新的图像,在图像中产生新的绘图区域等等。使用的时候,我们可以使用 import 导入 pyplot 库,并设置一个别名 plt:import matplotlib.pyplot?as plt

这样我们就可以使用 plt 来引用 Pyplot 包的方法。

3.编写程序

调用numpy、matplotlib、PIL库进行实践:

  1. from?PIL?import?Image??
  2. import?numpy?as?np??
  3. import?matplotlib.pyplot?as?plt??

plt(matplotlib.pyplot)使用rc配置文件来自定义图形的各种默认属性,称之为“rc配置”或“rc参数”。

通过rc参数可以修改默认的属性,包括窗体大小、每英寸的点数、线条宽度、颜色、样式、坐标轴、坐标和网络属性、文本、字体等。rc参数存储在字典变量中,通过字典的方式进行访问。

用来正常显示中文标签?,显示负号,设置分辨率?:

  1. plt.rcParams['font.sans-serif']=['SimHei']?
  2. plt.rcParams['axes.unicode_minus']?=?False?
  3. plt.rcParams['figure.dpi']?=?200?#分辨率??

??

可以输入不同的图片路径:

  1. filename?=?input('图像路径:')??
  2. image?=?Image.open(filename)??

??

把输入的图片利用numpy?库转为矩阵形式储存:

  1. image_array?=?np.array(image)??

??

可以输入用户想要拉伸到的最大值、最小值。

用int()、eval()都可以把用户输入的字符串类型转为数值:

  1. stretch_max=?int(input('拉伸到最大值maximum:'))??
  2. stretch_min=?eval(input('拉伸到最小值minimum:'))??

获得想要被拉伸的原图的最大、最小值:

  1. ?max?=?np.max(image_array)??
  2. ?min?=?np.min(image_array)??

b.shape[0]代表包含二维数组的个数,b.shape[1]表示二维数组的行数,b.shape[2]表示二维数组的列数。

然后运用公式对图像进行处理:

公式:?(每一个灰度 - 灰度最小值)*(拉伸后最大值 - 拉伸后最小值)+拉伸后最小值

(灰度最大值-灰度最小值)

Image.fromarray实现array到image的转换,把矩阵转为最后的图像final_image。

  1. b?=?image_array.shape??
  2. for?i?in?range(b[2]):??
  3. ????for?m?in?range(b[1]):??
  4. ????????for?n?in?range(b[0]):??
  5. ????????????image_array[n,?m,?i]?=?(image_array[n,?m,?i]?-?min)?/?(max?-?min)?*?(stretch_max?-?stretch_min)?+?stretch_min????
  6. final_image?=?Image.fromarray(image_array)??

??

自定义函数,并排显示图片及拉伸之后的直方图?:

  1. def?ShowImageAndHist(filename):??
  2. ????image?=?plt.imread(filename)#打开指定图片??
  3. ????print(image.shape)??

??

定义图片框:

  1. ????plt.figure()??

将画板分为1行两列,第一幅图显示原始图像:

  1. ????plt.subplot(1,2,1)???

??

定义标题和显示颜色条:

  1. ????plt.title("原图")??
  2. ????plt.imshow(image)??
  3. ????plt.colorbar(shrink=0.75)?#颜色条??

将画板为1行两列,第二幅图显示拉伸之后的图像,默认显示坐标轴。

plt.axis('off') :可以不显示坐标轴。

  1. ????plt.subplot(1,2,2)??
  2. ????plt.title("拉伸图像")??
  3. ????#plt.axis('off')??#?不显示坐标轴??
  4. ????plt.imshow(final_image)??

图片窗中展示图片:

  1. ????plt.show()??

??

调用我们自定义的函数ShowImageAndHist,传入参数(图片的路径),即可获得原图像和灰度图像共同显示。

  1. if?__name__?==?'__main__':??
  2. ????ShowImageAndHist(filename)?

?4. 运行结果

显示结果如下:

?

?

5.创新亮点

①本次实验具有一定的交互性,可以用户输入图像的绝对位置或相对位置,可以手动输入拉伸后的最大、最小值进行拉伸,通过shape关键字获取图像形状,返回图像行数、列数以及通道数的元组。

②本代码灰度图像和彩色图像都可以进行处理。

③本次实验结果会同时显示原图和拉伸之后的图像,可以进行一个拉伸效果的对比,更具有直观性。

④实践结果使用了标题、颜色条、坐标轴进行显示,意在丰富图片显示时的内容,更具有美观性。

6.总代码


# 图像线性拉伸
from PIL import Image
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.sans-serif']=['SimHei']#用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False# 显示负号
# 默认的像素:[6.0,4.0],分辨率为100,图片尺寸为 600&400
# 指定dpi=200,图片尺寸为 1200*800;# 指定dpi=300,图片尺寸为 1800*1200
# 设置figsize可以在不改变分辨率情况下改变比例
plt.rcParams['figure.dpi'] = 200 #分辨率

#图像位置: D:/桌面 C盘移过来/数字图像处理实习/数字图像处理彩色图像.jpg
filename = input('图像路径:')
image = Image.open(filename)

# 图片转为矩阵
image_array = np.array(image)

# 拉伸到最大、最小值
stretch_max= int(input('拉伸到最大值maximum:'))
stretch_min= eval(input('拉伸到最小值minimum:'))
# 原图的最大、最小值
max = np.max(image_array)
min = np.min(image_array)

b = image_array.shape

for i in range(b[2]):
    for m in range(b[1]):
        for n in range(b[0]):
            image_array[n, m, i] = (image_array[n, m, i] - min) / (max - min) * (stretch_max - stretch_min) + stretch_min
#最后的图像 把矩阵转为图
final_image = Image.fromarray(image_array)


# 并排显示图片及拉伸之后的直方图
def ShowImageAndHist(filename):
    image = plt.imread(filename)#打开指定图片
    print(image.shape)

    plt.figure()#定义图片框
    plt.subplot(1,2,1) # 将画板分为4行两列
    plt.title("原图")
    plt.imshow(image)#图片显示原始图像
    #plt.axis('off')  # 不显示坐标轴
    plt.colorbar(shrink=0.75) #颜色条

    plt.subplot(1,2,2)
    plt.title("拉伸图像")
    #plt.axis('off')  # 不显示坐标轴
    plt.imshow(final_image)

    plt.show()#窗口中展示图片

if __name__ == '__main__':

    #filename = r'D:/桌面 C盘移过来/数字图像处理实习(已完成)/数字图像处理彩色图像.jpg'
    ShowImageAndHist(filename) 

?

?

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2022-10-08 20:37:01  更:2022-10-08 20:37:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/26 3:39:36-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码
数据统计