菜狗整理的学习笔记,一边学习,一边防止忘记

数字图像处理基础知识

方法

  1. 一般步骤:图像信息的获取、存储、处理、传输和展示。
  2. 常见处理方法:图像的数字化、编码、增强、恢复、变换、压缩、存储、传输、分析、识别、分割、描述和分类。
  3. 图像分割的主要目的是将图像分解为若干有意义的部分。图像分割技术可以作为图像识别、分析、理解的基础。在图像分割的基础上,形成图像的区域、边缘特征描述,借助模式识别相关技术,完成图像的语义分析和理解;图像分类(识别)是模式识别领域的重要技术之一,其主要目的是对图像的类型进行判别或者对图像中出现的物体进行检测和识别。图像分类的一般步骤:进行图像特征提取和描述、使用模式识别技术进行分类器或检测器的训练、对目标图像进行分类和识别。

图片的采样和量化

采样

  1. 是将图像空间坐标的离散化,决定了空间分辨率。
  2. 将一幅在空间上连续分布的模拟图像成MN的网络,每一个网格为一个像素,其中MN就是分辨率。

利用data内置图像:

from skimage import data
from matplotlib import pyplot as plt
import numpy as np

image = data.chelsea() #使用data自带图片
print(image.shape) #显示图像原始大小
print(type(image)) #显示图像类型
ratio = 20 #设置采样比率
#设置采样后图片大小
image1 = np.zeros((int(image.shape[0] / ratio), int(image.shape[1] / ratio), image.shape[2]), dtype='int32')
#对图像进行遍历
for i in range(image1.shape[0]):
    for j in range(image1.shape[1]):
        for k in range(image1.shape[2]):
            delta = image[i * ratio:(i + 1) * ratio, j * ratio:(j + 1) * ratio, k] #获取需要采样的图像块
            image1[i, j, k] = np.mean(delta) #计算均值,并存入结果图像

plt.imshow(image1)
plt.show() #打印采样后的图像

在这里插入图片描述在这里插入图片描述使用外部图片:

#from skimage import data
from skimage import data,io
from matplotlib import pyplot as plt
import numpy as np

img = io.imread('tomato.jpg')
#image = data.chelsea() #使用data自带图片
#print(image.shape) #显示图像原始大小
#print(type(image)) #显示图像类型
ratio = 20 #设置采样比率
#设置采样后图片大小
#image1 = np.zeros((int(image.shape[0] / ratio), int(image.shape[1] / ratio), image.shape[2]), dtype='int32')
image2 = np.zeros((int(img.shape[0] / ratio), int(img.shape[1] / ratio), img.shape[2]), dtype='int32')
#对图像进行遍历
#for i in range(image1.shape[0]):
#    for j in range(image1.shape[1]):
#        for k in range(image1.shape[2]):
#            delta = image[i * ratio:(i + 1) * ratio, j * ratio:(j + 1) * ratio, k] #获取需要采样的图像块
#            image1[i, j, k] = np.mean(delta) #计算均值,并存入结果图像

#plt.imshow(image1)
io.imshow(img)
plt.show() #打印采样后的图像

量化

  1. 经过采样后,在空间上实现了离散化,形成了像素,像素值依旧是连续量。采样后所得的各像素的灰度值从连续量到离散量的转换成为灰度量化。
  2. 像素值I(x,y)的数字化成为图像的量化,从I(max)到I(min)的实数域映射为有限级别的离散值。
  3. 图像的量化比率决定了图像的颜色精细程度。
#from skimage import data
from skimage import data,io
from matplotlib import pyplot as plt
import numpy as np

#img = io.imread('tomato.jpg')
image = data.chelsea() #使用data自带图片
radio = 128 #设置采样比率

#对图像进行遍历
for i in range(image.shape[0]):
    for j in range(image.shape[1]):
        for k in range(image.shape[2]):
            #对图像中每个像素进行量化
            image[i][j][k] = int(image[i][j][k] / radio) * radio


plt.imshow(image)
#io.imshow(img)
plt.show() #打印采样后的图像

图像的表示

表示

  1. 通过采样和量化,原本连续的图像I=(x,y)转换为一个二维矩阵f(x,y),具有M行N列。
  2. 用二维矩阵来表示量化后的图像(所以线性代数好好学啊,家银们
  3. 图像分辨率指组成一幅图像的像素密度。包括空间分辨率和灰度级。

基本属性

  1. 图像像素数量。图像像素数量是指在位图图像的水平和垂直方向上包含的像素数量。
  2. 图像分辨率。图像在单位打印长度上分布的像素数量,主要用以表征数字图像信息的密度,决定了图像的清晰程度。在单位大小面积上,图像的分辨率越高,包含的像素点的数量越多,像素点越密集,数字图像的清晰度也就越高。
  3. 图像大小。决定存储图像文件所需的存储空间,字节数(单位B)=(位图高 * 位图宽 * 图像深度)/ 8.
  4. 图像颜色。指数字图像中具有的最多数量的可能颜色种类,通过改变红、绿、蓝三原色的比例,可以非常容易地混合成任意一种颜色。
  5. 图像深度。又称图像的位深,是指图像中每个像素点所占的位数。数据深度越深,所需位数越多,对应的颜色表示也就越丰富。
  6. 图像色调。指各种图像颜色对应原色的明暗程度。
  7. 图像饱和度。表明了图像中颜色的纯度。一般用纯色中混入白光的比例衡量饱和度,纯色中混入的白光越多,饱和度越低。、
  8. 图像亮度。指数字图像中包含色彩的明暗程度,是人眼对物体本身明暗程度的感觉。
  9. 图像对比度。图像中不同颜色的对比或者明暗程度的对比。对比度越大,颜色之间的亮度差异越大或者黑白差异越大。
  10. 图像层次。在计算机设计系统中,为了更加便捷有效的处理图像素材,通常将他们置于不同的层中,而图像可看作由若干层图像叠加而成。

图像基本属性的操作

#from skimage import data
import skimage
from skimage import data
from matplotlib import pyplot as plt
import numpy as np

#改变对比度函数
def change_alpha(im,a):
    im_change = np.zeros(shape=im.shape, dtype='unit8')
    for i in range(im.shape[0]):
        for j in range(im.shape[1]):
            for k in range(im.shape[2]):
                if im[i, j, k] * a >255:
                    im_change[i, j, k] = 255
                elif im[i, j, k] * a < 0:
                    im_change[i, j, k] = 0
                else:
                    im_change[i, j, k] = im[i, j, k] * a
    return im_change

if __name__ == '__main__':
    image = skimage.data.coffee()
    im_changed = change_alpha(image, 1.5)
    plt.imshow(im_changed)
    plt.show()

颜色通道处理

每个颜色对应一个通道。

from skimage import data,io
from matplotlib import pyplot as plt
#image = data.chelsea()
image = io.imread('tomato.jpg')
#分别读取出红绿蓝三个通道
image_r = image[:, :, 0]
image_g = image[:, :, 1]
image_b = image[:, :, 2]
#分别显示出3个通道
plt.subplot(2, 2, 1)
io.imshow(image)

plt.subplot(2, 2, 2)
io.imshow(image_r)

plt.subplot(2, 2, 3)
io.imshow(image_g)

plt.subplot(2, 2, 4)
io.imshow(image_b)

在这里插入图片描述

图像的简单运算

算术运算和逻辑运算

  1. 因为只涉及一个空间像素的位置,所以从原存放输入图像的空间直接得到输出图像。
# coding=utf-8
from matplotlib.font_manager import FontProperties

font_set = FontProperties(fname=r"#name", size=12)
from skimage import data
from matplotlib import pyplot as plt

moon = data.moon()
camera = data.camera()
image_minus = moon - camera
image_plus = moon + camera
plt.set_cmap(cmap='gray')

plt.subplot(2, 2, 1)
plt.title('月亮图像', fontproperties=font_set)
plt.imshow(moon)

plt.subplot(2, 2, 2)
plt.title('摄影师图像', fontproperties=font_set)
plt.imshow(camera)

plt.subplot(2, 2, 3)
plt.title('月亮加摄影师图像', fontproperties=font_set)
plt.imshow(image_plus)

plt.subplot(2, 2, 4)
plt.title('月亮减摄影师图像', fontproperties=font_set)
plt.imshow(image_minus)

plt.show()

点运算

  1. 点运算:只涉及一幅图像,运算对象是输入图像像素的灰度值。有两个特点:点运算不会改变像素的空间位置;根据某种预先设置的规则,将输入图像各个像素本身的灰度逐一转换成输出图像对应像素的灰度值。可分为线性点运算和非线性点运算。
  2. skimage中的exposure模块中包含幂次变换函数adjust_gamma,可以对图像进行幂次变换。
from skimage import data,io,exposure
from matplotlib import pyplot as plt

#读入图像
#image = data.chelsea()
image = io.imread('tomato.jpg')

#分别计算gamma=0.2,0.67,25时的图像
image1 = exposure.adjust_gamma(image,0.2)
image2 = exposure.adjust_gamma(image,0.67)
image3 = exposure.adjust_gamma(image,25)

#分别展示原图和结果图像
plt.subplot(2, 2 ,1)
plt.title('gamma = 1')
io.imshow(image)

plt.subplot(2, 2 ,2)
plt.title('gamma = 0.2')
io.imshow(image1)

在这里插入图片描述

图像直方图

  1. 描述图像中关于颜色的数量特征,反映颜色的统计部分和基本色调。
  2. 颜色直方图可以分类为:全局直方图、累加直方图和主色调直方图。
  3. 使用skimage的exposure的instogram()函数来计算。
from skimage import data,io,exposure
from matplotlib import pyplot as plt

#读入图像
#image = data.chelsea()
image = io.imread('tomato.jpg')

#计算直方图
hist_r = exposure.histogram(image[:, :, 0], nbins = 256)
hist_g = exposure.histogram(image[:, :, 1], nbins = 256)
hist_b = exposure.histogram(image[:, :, 2], nbins = 256)

#展示图像
plt.subplot(2, 2, 1)
plt.imshow(image)
plt.title('image')

plt.subplot(2, 2, 2)
plt.hist(hist_r)
plt.title('hist_r')

plt.subplot(2, 2, 3)
plt.hist(hist_g)
plt.title('hist_g')

plt.subplot(2, 2, 4)
plt.hist(hist_b)
plt.title('hist_b')

plt.tight_layout()
plt.show()

在这里插入图片描述

  1. 直方图均衡化:通过使用累积函数对灰度值进行调整,以实现对比度增强。中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。主要作用是将灰度间隔小的图像的灰度间隔放大,方便观察。
from skimage import data,io,exposure
from matplotlib import pyplot as plt

#读入图像
#image = data.chelsea()
image = io.imread('tomato.jpg')
plt.figure('hist',figsize=(8, 8))
arr = image.flatten()

#展示图像
plt.subplot(2, 2, 1)
plt.imshow(image, plt.cm.gray)

plt.subplot(2, 2, 2)
plt.hist(arr, bins=256, edgecolor='None', facecolor='red') #原始图像直方图

image1  = exposure.equalize_hist(image)
arr1 = image1.flatten()

plt.subplot(2, 2, 3)
plt.imshow(image1, plt.cm.gray)

plt.subplot(2, 2, 4)
plt.hist(arr1, bins=256, edgecolor='None', facecolor='red')

plt.show()

在这里插入图片描述

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐