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

目录

前言

图像像素格式

图像读写


前言

        本专栏面向所有希望或有兴趣从事数字图像处理工作、学习或研究的朋友,编程语言采用了当下最火的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 img
 
im = 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 output
        format 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 respectively
        will be used for color scaling.
      *cmap*:
        cmap is a colors.Colormap instance.
      *format*:
        One of the file extensions supported by the active
        backend.  Most backends support png, pdf, ps, eps and svg.
      *origin*
        [ 'upper' | 'lower' ] Indicates where the [0,0] index of
        the array is in the upper left or lower left corner of
        the axes. Defaults to the rc image.origin value.
    """

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

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

                                                                                          Fig.5 图像显示示例

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

 

 

Trent1985 CSDN认证博客专家 深度学习 人像美颜美妆算法 图像特效
本人多年来专注图像特效、人像美颜美妆算法研究、AI美颜美妆探索,著有《图像视频滤镜与人像美颜美妆算法详解》一书,欢迎 志同道合的朋友们一起学习交流!
个人座右铭:谨言慎行,三思而后行!
©️2020 CSDN 皮肤主题: 成长之路 设计师:Amelia_0503 返回首页
实付 19.90元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值