• Python数据分析与挖掘————图像的处理


    系列文章目录



    前言

    在大数据流行的今天,对数据的处理以及分析都成了至关重要的方面。二我们这节所要学的就是对图片的处理。利用代码去处理一些图片。以及认识图片的本质。

    图片的马赛克

    我们都知道,在生活中我们有时候为了不暴露我们的信息。照片有时就会用马赛克的方式来隐藏我们的基本面貌信息。虽然现在手机推出了很多的软件可以对图片进行马赛克处理,但是大多数的软件马赛克都是已经设定好的,无法更改他们的值。而今天我们就可以用到Python中的matplotlib模块来实现图片的马赛克。

    一.安装matplotlib,numpy等模块

    python的编写有人用的时VS code,也有pycharm编译器。这里介绍vs code编译器。
    一.按住win+R键,打开控制端,输入cmd命令;
    在这里插入图片描述
    二.在打开的用户控制界面输入pip install [模块]命令;
    在这里插入图片描述
    如上图一样,将需要下载的模块输入,下载成功后就可以使用模块。而对于使用pycharm编译器的同学,就打开pycharm的终端,输入pip install [模块]
    就可以了。
    三.使用模块
    我们主要使用的时matplotlib中的image,故我们导入模块;

    import matplotlib.image as mpimg
    import math
    import numpy as np
    import matplotlib.pyplot as plt
    
    • 1
    • 2
    • 3
    • 4

    导入模块后,我们就可以进行图片的处理了.

    二.马赛克图片

    一.导入图片

    matplotlib.image中的imread()函数就是用来读取图片的编码的。我们可以提前将要使用的图片放在该目录下,也可直接导入,这里博主就使用上次爬虫得到的图片。具体的图片你自己根据自己的情况来定
    data_jpg=mpimg.imread('D:\CSDN图片\work.jpg') #导入图片,解码
    在这里插入图片描述
    我们打印一下他的值,我们会发现图片解码后就是一个三维数组。而我们对他的操作都是这个数组的操作。

    二.定位区域

    我们对需要打马赛克的位置进行定位,(imshow()函数
    在这里插入图片描述
    我们会发现我们导入的图片的周围出现了刻度,我们可以根据他上面的刻度来估计我们要进行打码的位置。找到打码的位置后,进行切割;
    data1=data_jpg[50:320,150:350]
    在这里插入图片描述
    然后我们就会得到一个经过切割过的图片。我们现在就对这张图片进行像素进行细分割。
    data1=data1[::27,::40]根据自己的需要,定义分割的值,这里就表示了把图片的像素以27(y轴),40(x轴)的间隔进行切割为一个像素。就会形成马赛克。
    在这里插入图片描述

    三.图片的合成

    最后将上面已经马赛克化的图片区域拷贝到原图片中就可以了;

    for i in range(10):
        for j in range(5):
            data2[50+27*i:50+27+27*i,150+40*j:150+40+40*j]=data1[i,j]
    
    • 1
    • 2
    • 3

    最后,将图片显示出来就可以了,如果需要保存,就使用savefig()函数即可;
    现在我们来看看最后的效果;
    在这里插入图片描述
    源代码展示;

    import matplotlib.image as mpimg
    import math
    import numpy as np
    import matplotlib.pyplot as plt
    data_jpg=mpimg.imread('D:\CSDN图片\work.jpg')
    #plt.imshow(data_jpg)
    #马赛克;
    data2=data_jpg.copy()
    data1=data_jpg[50:320,150:350]
    #plt.imshow(data1)
    data1=data1[::27,::40]
    #plt.imshow(data1)
    for i in range(10):
        for j in range(5):
            data2[50+27*i:50+27+27*i,150+40*j:150+40+40*j]=data1[i,j]
    plt.imshow(data2)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    图片拼接

    python中队图片的处理,除了可以打马赛克,还可以对其进行变色,虚拟化,灰图像处理,图片拼接等功能;
    concatenate()函数
    图片的拼接就是用concatenate()函数实现;
    在这里插入图片描述

    import matplotlib.image as mpimg
    import math
    import numpy as np
    import matplotlib.pyplot as plt
    data_jpg=mpimg.imread('D:\CSDN图片\work.jpg')
    data3=np.concatenate([data_jpg,data_jpg],axis=1)
    plt.imshow(data3)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    图像的灰度化

    一.max()方法

    上文提到的,图片的组成就是一个三维数组,其中的数字代表了他们的图像特点。所以,图像的灰度化,也就可以通过改变他们的位置,值,维度来改变图片的颜色,形状.
    我们可以看下面的例子;

    import matplotlib.image as mpimg
    import math
    import numpy as np
    import matplotlib.pyplot as plt
    data_jpg=mpimg.imread('D:\CSDN图片\work.jpg')
    print(data_jpg)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    [[[215 221 211]
      [215 221 211]
      [215 221 211]
      ...
      [204 189 182]
      [203 188 181]
      [202 187 180]]
    
     [[215 221 211]
      [215 221 211]
      [215 221 211]
      ...
      [204 189 182]
      [203 188 181]
      [202 187 180]]
    
     [[215 221 211]
      [215 221 211]
      [215 221 211]
      ...
      [204 189 182]
      [203 188 181]
      [201 186 179]]
    
     ...
    ...
      ...
      [188 150 137]
      [189 151 138]
      [189 151 138]]]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    data_jpg=mpimg.imread("D:\CSDN图片\work.jpg")
    #最大值法;
    s=np.max(data_jpg,axis=-1)#axis取-1就是为了得到最里面的值;
    plt.imshow(s,cmap='gray') #cmap参数表示最后的颜色,gray时灰色;
    
    • 1
    • 2
    • 3
    • 4

    效果展示;
    在这里插入图片描述

    二.min()方法

    和max()方法相似,所以这里不做过多的介绍,就直接粘贴代码;

    data_jpg=mpimg.imread("D:\CSDN图片\work.jpg")
    sss=np.min(data_jpg,axis=-1)
    plt.imshow(sss,cmap='gray')
    
    • 1
    • 2
    • 3
    三.平均值法mean()函数
    data_jpg=mpimg.imread("D:\CSDN图片\work.jpg")
    #最大值法;
    s=np.max(data_jpg,axis=-1)
    plt.imshow(s,cmap='gray')
    
    • 1
    • 2
    • 3
    • 4

    效果展示;
    在这里插入图片描述
    和上面的方法所得出的效果基本相似。所以,掌握其中一种方法即可.

    四.加权平均值法

    和平均值法不一样的是,加权平均值法可以根据自己给的数据不同的灰度化;

    data_jpg=mpimg.imread("D:\CSDN图片\work.jpg")
    weight=[0.01,0.01,0.01]  #这里的值自己更改,值越大,灰度化颜色偏深,反之则偏浅.
    ss=np.dot(data_jpg,weight)
    plt.imshow(ss,cmap='gray')
    
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    图片的分割

    有时候我我们只需要图片其中的一小部分,那我们就可以通过分割函数split()函数来实现;

    one,data4,two=np.split(data_jpg,indices_or_sections=[100,400],axis=1) #中间的参数表示我们分割的区间;
    plt.imshow(data4)
    plt.imshow(one)
    plt.imshow(two)
    
    • 1
    • 2
    • 3
    • 4

    效果展示;

    在这里插入图片描述

    总结

    本节我要介绍的就这些了,对于图片的处理还有很多的方式,这里就先不过多的介绍,后面我会继续更新。利用代码实现图片的处理,会有很大的灵活使用空间,不局限于手机软件的限制,所以掌握这些方式也是有很大的益处.
    源代码放在了下面,有兴趣的同学可以看一下.

    源代码

    
    import matplotlib.image as mpimg
    import math
    import numpy as np
    import matplotlib.pyplot as plt
    data=mpimg.imread("./onetemp.jpg")
    data1=data.copy()
    #打马赛克;
    #第一步,找出要打马赛克的位置;
    data2=data1[200:900,100:800]
    #第二步,将图片比例的收缩;
    data2=data2[::35,::35]
    print(data2.shape)
    datatemp=data1.copy()
    #第三步,替换,将现有的替换到原来的,记住两个尺寸不一样;
    for i in range(20):
        for j in range(20):
            datatemp[200+35*i:200+35*i+35,100+35*j:100+35*j+35]=data2[i,j]
    plt.imshow(datatemp)
    
    #图片的拼接;
    data4=np.concatenate([data,data])#axis=1时,并排着;
    plt.imshow(data4)
    data5=np.concatenate([data,data],axis=1)
    plt.imshow(data5)
    #图片切割;
    one,two,three=np.split(data,indices_or_sections=[400,600],axis=1)
    plt.imshow(one)
    plt.imshow(two) 
    plt.imshow(three)
    
    #图像灰度化;
    #第一种方法,最小值法;
    data=mpimg.imread('./onetemp.jpg')
    #data=np.min(data,axis=-1)
    #plt.imshow(data,cmap='gray')
    #第二种方法,最小值法;
    data1=np.max(data,axis=-1)
    #plt.imshow(data1,cmap='gray')
    #第三种,平均值法;
    data3=np.mean(data,axis=-1)#等价于data.mean()函数;
    #plt.imshow(data3,cmap='gray')
    
    #第四种方法,加权平均值法,dot函数;
    weight=[0.299,0.345,0.456]
    data6=np.dot(data,weight)
    plt.imshow(data6,cmap='gray')
    
    
    data_jpg=mpimg.imread('D:\CSDN图片\work.jpg')
    print(data_jpg)
    #plt.imshow(data_jpg)
    #马赛克;
    data2=data_jpg.copy()
    data1=data_jpg[50:320,150:350]
    #plt.imshow(data1)
    data1=data1[::27,::40]
    #plt.imshow(data1)
    for i in range(10):
        for j in range(5):
            data2[50+27*i:50+27+27*i,150+40*j:150+40+40*j]=data1[i,j]
    plt.imshow(data2)
    
    
    #照片的合集;
    import matplotlib.image as mpimg
    import math
    import numpy as np
    import matplotlib.pyplot as plt
    data_jpg=mpimg.imread('D:\CSDN图片\work.jpg')
    data3=np.concatenate([data_jpg,data_jpg],axis=1)
    plt.imshow(data3)
    
    #图片的切割;
    one,data4,two=np.split(data_jpg,indices_or_sections=[100,400],axis=1)
    plt.imshow(data4)
    #plt.imshow(one)
    #plt.imshow(two)
    
    #图像的灰度化;
    data_jpg=mpimg.imread("D:\CSDN图片\work.jpg")
    #最大值法;
    s=np.max(data_jpg,axis=-1)
    plt.imshow(s,cmap='gray')
    #加权平均值法;
    data_jpg=mpimg.imread("D:\CSDN图片\work.jpg")
    weight=[0.31,0.41,0.53]
    ss=np.dot(data_jpg,weight)
    plt.imshow(ss,cmap='gray')
    
    #平均值法;
    smp=np.mean(data_jpg,axis=-1)
    plt.imshow(smp,cmap='gray')
    
    #最小值法;
    sss=np.min(data_jpg,axis=-1)
    plt.imshow(sss,cmap='gray')
    
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
  • 相关阅读:
    SV中的随机化约束
    基于5G网关的风力发电远程监测方案优势
    C# GetField 方法应用实例
    深度剖析堆及代码实现
    【编程不良人】SpringSecurity实战学习笔记01---权限管理、环境搭建
    python报错 UnicodeDecodeError
    性能测试 —— Jmeter 常用三种定时器
    【Lua 入门基础篇(一)】基本语法&数据类型
    【在clion中配置使用和调试ros工程】
    ubuntu22.04下hadoop3.3.6+hbase2.5.6+phoenix5.1.3开发环境搭建
  • 原文地址:https://blog.csdn.net/qq_59931372/article/details/127470557