目录

前言

图像像素格式

图像读写


前言

本专栏面向所有希望或有兴趣从事数字图像处理工作、学习或研究的朋友,编程语言采用了当下最火的Python语言。

Python是一种跨平台的计算机设计语言,也是一个高层次的结合了解释性、编译性、互动性和面向对象的脚本语言,被方便的应用于各种项目开发中,尤其是人工智能的发展,Python以极简的姿态在深度学习领域行云流水。很多初学者也由于Python的简单、易用性开始学习这门语言,本专栏将以Python语言来讲述如何学习数字图像处理算法的相关内容。

目前而言,已经有了很多优秀的Python图像处理模块,比如scipy,opencv python 版, matlab等等,这些库很强大,可以方便大家快速调用图像算法接口,去实现一些图像算法,但是,会调用接口不等价于会图像算法,这个也是本文的重点。授人以鱼不如授人以渔,如果你只会Python,想要真正的学习图像算法,而不是永远调用别人的图像算法库,那么,这里将教会你如何“捕鱼”!本专栏将以numpy为基础,在介绍图像算法的同时,用代码实现算法内容,不依赖其他库诸如scipy、cv2等等,仅使用Matplotlib来读取和显示图像,帮助大家快速掌握,轻松入门,这也是本专栏和作者的初衷。

说句题外话,个人理解,学习图像算法,就要像华为一样,掌握核心技术(掌握图像算法精髓),才不至于受制于人!就算哪天matlab不给我用了,我也可以开心的告诉别人“没有matlab我可以做中国自己的matlab”!

图像像素格式

对于初学者,往往搞不清楚,一个像素究竟是什么?针对数字图像中的位图而言,一张宽度W,高度H的图像是由W×H个像素点来表示的,每个像素都包含了各自的颜色信息,所以我们的感官才会感知到不同图像各自是什么颜色的。要有颜色的概念,我们就要先了解色彩的深度。

色彩深度就是色彩的位数,代表了一个像素用多少个二进制位来表示颜色信息。常用的色彩深度有1位(也就是单色),2位(也就是4色CGA),4位(也就是16色VGA),8位(也就是256色),16位(增强色)以及24位和32位真彩色等。听起来对于初学者好像不容易理解,我们这里以黑白二值图、灰度图和24/32位彩色图四类来做说明。

黑白二值单色图像:图像中每个像素点非黑即白,对于像素值非0即1,每一个像素用一个数值也就是1个二进制位即可表示(一个二进制位代表0或者1),因此,这种黑白二值图也可以叫作单色图,黑白二值图像举例如下图Fig.1所示。

Fig.1黑白二值图像示例

在Fig.1中,对于任意像素P0,如果它是黑色像素,那么P0=0,反之,P0=1,这就是黑白二值图像中像素P0的数字表示,注意这里使用的是0-1来表示像素值,实际上常用的还有0-255,也就是uchar类型,后面我们将统一以0-255来表示像素值。

8位灰度图像:8位灰度图像是指用8个bit位来表示颜色信息的图像,颜色信息范围位0-255,0是黑色,255是白色,对应的二进制位表示如下:

0的二进制位表示:00000000

255的二进制位表示:11111111

8位灰度图像举例如图Fig.2所示,看起来是一张灰色的图像,但是人物细节等颜色信息明显要比单色二值图像要多很多,因为二值图像只有0和1两个颜色信息,而灰度图有0-255共256个颜色信息;

Fig.2 8位灰度图示例

在Fig.2中,对于任意像素P0,如果它是黑色像素,那么P0=0,白色P0=255,其他颜色则P0在0到255之间。这就是8位灰度图像中像素P0的数字表示。

24位彩色图像:为了表示更加丰富的彩色信息,我们基于三原色RGB,将每个像素分为了R、G和B三个颜色分量,即红色分量Red,绿色分量Green和蓝色分量Blue。同时,我们对于每个分量都使用8个二进制位也就是1个字节大小来表示它的颜色信息,对应数值范围为0-255。这样,一个像素占用3个字节,24个Bit位,也就是24位彩色图像。颜色信息则是RGB三个颜色分量的组合,由于每个分量可以表示0-255共256种颜色,因此,24位彩色图像像素共有256×256×256种颜色信息,我们也将RGB三个颜色分量叫作三个通道,举例如图Fig.3所示。

Fig.3 24位彩色图像示例

在Fig.3中,对于任意像素P0,如果它是黑色像素,那么P0=(R=0,G=0,B=0),白色P0=(R=255,G=255,B=255),通常我们用一个RGB坐标轴的三维坐标来表示,即黑色P0(0,0,0),白色P0(255,255,255)。这就是24位彩色图像中像素P0的数字表示。

32位彩色图像:理解了24位彩色图像,那么,32位彩色图像就是在24位彩色图像的基础上添加了一个透明通道alpha位,我们经常看到一些有透明区域的图像,这些透明区域如何控制,就是依靠这个alpha通道来实现的。对于32位彩色图像的每个像素,我们使用RGBA四个颜色分量来表示,A就是透明度分量,同样占用1个字节8个bit,所以,一个像素共占用32个bit,4个字节。我们称32位彩色图像有4个通道,也就是RGBA四通道。对于黑色像素表示为(0,0,0,A),白色像素表示为(255,255,255,A),举例如图Fig.4所示。

Fig.4 32位彩色图像示例

在Fig.4中,方格子区域就表示这些区域的像素透明通道是0(全透明),我们可以看到的人物区域像素的透明通道是255(不透明)。由于每个像素的RGBA数值都在0-255之间,因此,对于Fig.4这张宽高为256×256大小的灰度图而言,由于每个像素有四个通道,所以,它的大小为W×H×4。

上述就是常用的像素格式介绍,下面我们来说图像读写。

图像读写

图像读写也叫做图像编解码,图像编解码是数字图像处理中的重要组成部分,甚至是一个可以单独出书的模块。由于图像格式多种多样,需要对每一种图像进行格式分析,然后单独编解码,同时还要考虑效率和质量问题,因此,也是一个难啃的骨头。对于初学者而言,想要自己实现常用图像的编解码算法,基本不太现实,常用的方法就是调用各种第三方库,这里,我们直接使用Matplotlib库。

Python一个优点就是方便,使用Matplotlib读写图像也是非常简单,代码如下:

import numpy as np
import  matplotlib.pyplot as plt
import matplotlib.image as imgim = img.imread("data/test/2.bmp")#图像读取
print(im.shape)
plt.imshow(im)#图像显示
img.imsave(“data/test/save.jpg”,im)

在Matplotlib中,图像读取使用imread函数,它可以读取一个图像的文件名或者一个文件的URL,在或者是一个图像的二进制文件。读取成功后会返回一个数组array,根据上文中所说的图像像素格式,它返回的数组大小如下:

  • (M, N) for grayscale images .#灰度图像
  • (M, N, 3) for RGB images.    #24位彩色图像
  • (M, N, 4) for RGBA images. #RGBA32位彩色图像

在Matplotlib中,图像保存使用imsave函数,它的定义如下:

def imsave(fname, arr, clims=None, cmap=None, format=None, origin=None):"""Saves a 2D array as a bitmapped image with one pixel per element.The output formats available depend on the backend being used.Arguments:*fname*:A string containing a path to a filename, or a Python file-like object.If *format* is *None* and *fname* is a string, the outputformat is deduced from the extension of the filename.*arr*:A 2D array.Keyword arguments:*clims*:clims sets the color scaling for the image.It is a tuple (vmin, vmax) that is passed through to the pyplot clim function.If either *vmin* or *vmax* is None, the image min/max respectivelywill be used for color scaling.*cmap*:cmap is a colors.Colormap instance.*format*:One of the file extensions supported by the activebackend.  Most backends support png, pdf, ps, eps and svg.*origin*[ 'upper' | 'lower' ] Indicates where the [0,0] index ofthe array is in the upper left or lower left corner ofthe axes. Defaults to the rc image.origin value."""

如果你说你是小白,看不懂这么多,那么,就像我的示例代码中所示,直接输入一个路径即可。

最后,如果你需要显示图像看一下,可以直接使用imshow函数,plt.imshow(im)如下图所示:

Fig.5 图像显示示例

本小节是Python数字图像处理入门第一小节,主要掌握如何使用Matplotlib进行图像读写和显示,同时带大家了解了灰度图、24位/32位图像像素格式,希望大家再接再厉!

Python数字图像处理---1.1图像的像素格式与图像读写相关推荐

  1. C语言数字图像处理---1.1图像的像素格式与图像读写

    前言 本专栏面向所有希望或有兴趣从事数字图像处理工作.学习或研究的朋友,不懂MATLAB和OPENCV没关系,仅需要基础的C语言知识,便可以通过本专栏内容轻松入门数字图像处理方向.目前市面上的数字图像 ...

  2. 第2章 Python 数字图像处理(DIP) --数字图像基础4 -- 像素间的一些基本关系 - 邻域 - 距离测试

    目录 像素间的一些基本关系 像素的相信像素 距离测试 import sys import numpy as np import cv2 import matplotlib import matplot ...

  3. python绘制灰度图片直方图-python数字图像处理实现直方图与均衡化

    在图像处理中,直方图是非常重要,也是非常有用的一个处理要素. 在skimage库中对直方图的处理,是放在exposure这个模块中. 1.计算直方图 函数:skimage.exposure.histo ...

  4. python数字图像处理(17):边缘与轮廓

    在前面的python数字图像处理(10):图像简单滤波 中,我们已经讲解了很多算子用来检测边缘,其中用得最多的canny算子边缘检测. 本篇我们讲解一些其它方法来检测轮廓. 1.查找轮廓(find_c ...

  5. 第1章 Python 数字图像处理(DIP) --绪论

    Python 数字图像处理 关于本专栏 此专栏为 Python 数字图像处理(DIP)(冈萨雷斯版),专栏里文章的内容都是来自书里,全部手打,非OCR,因为很多公式,都是用LaTex输入,力求更好看的 ...

  6. python数字图像处理以及绘图

    1, subplot的使用 matlab中的用法: subplot(m,n,p)或者subplot(m n p) subplot是将多个图画到一个平面上的工具.其中,m和n代表在一个图像窗口中显示m行 ...

  7. (附源码)python数字图像处理课程平台 毕业设计 242339

    Python数字图像处理课程平台的开发 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人 ...

  8. (附源码)Python数字图像处理课程平台 毕业设计242339

    Python数字图像处理课程平台的开发 摘 要 数字图像处理是一门新兴技术,随着计算机硬件的发展,数字图像的实时处理已经成为可能,由于数字图像处理的各种算法的出现,使得其处理速度越来越快,能更好的为人 ...

  9. 对索引像素格式的图片进行Setpixel(具有索引像素格式的图像不支持SetPixel)解决方案

    对索引像素格式的图片进行Setpixel(具有索引像素格式的图像不支持SetPixel)解决方案 参考文章: (1)对索引像素格式的图片进行Setpixel(具有索引像素格式的图像不支持SetPixe ...

最新文章

  1. mysql更新后返回主键,我需要在MYSQL中更新表后返回的受影响行的主键。
  2. newman的键盘不错
  3. 3.浏览器输入www.baidu.com到显示主页的全过程
  4. 你好,同学!在云端学习最潮的技术吧!
  5. #279. [SYZOI Round1] 滑稽♂树(树状数组套主席树)
  6. 网页制作中如何自定义网页图标
  7. 微型计算机选用要点,微型计算机原理以及应用考试_new要点分析.doc
  8. 提高Python运行效率的六个窍门
  9. linux php oracle 乱码,linux安装oracle出现界面乱码
  10. 杭电2068RPG的错排
  11. 程序结构程序设计(二)
  12. 龚胤全云栖大会_2017云栖大会北京峰会
  13. OpenCV编程:最大熵阈值分割算法实现(代码可运行)
  14. SVN安装不成功卸载不干净后如何重装SVN和右键显示SVN
  15. Il2CppDumper的使用方法,ILSpy中文版的下载地址
  16. vs2017安装勾选哪些_vs2017安装以编写c语言
  17. indesign排版标点挤压_孔雀计划序——中文排版思路的重建
  18. SUMO交通仿真-核心概念和基础知识速览
  19. 转帖 -- 仙4语录
  20. 8421拨码开关C语言编程,8052单片机怎样读出8421BCD码拨码开关设定的数值

热门文章

  1. 十余种漂亮照片边框简单制作技巧
  2. C++ sprintf 方法使用示例( for循环数组,字符串拼接、删除、格式化等)
  3. kafka中彻底删除topics
  4. 估计标准误差syx_相关系数与估计标准误差的关系
  5. R语言计算多变量两两之间的相关关系及显著性
  6. Linux中ftp安装与基本操作
  7. speedoffice(Excel)表格怎么设置文字自动换行呢?
  8. MyBatis框架的使用及源码分析(八) MapperMethod
  9. 2022数学建模高教杯国家一等奖经验分享
  10. 记2019年高教杯全国大学生数学建模竞赛