Python
对数字图像进行读取和简单操作。JPEG
压缩技术串讲全章知识点。人工智能是引领未来发展的战略性技术,是新一轮科技革命和产业变革的重要驱动力量,将深刻地改变人类社会生活。
促进人工智能和实体经济的深度融合,构建数据驱动、人机协同、跨界融合、共创分享的智能经济形态,更是推动质量变革、效率变革、动力变革的重要途经。
进年来,我国人工智能新技术、新产品、新业态持续涌现,与农业、制造业、服务业等行业的融合步伐明显加快,在技术创新、应用推广、产业发展等方面成效初显。
人工智能技术并不是一个新生事物,它在最近几年引起全球性关注并得到飞速发展的主要原因,在于它的三个基本要素(算法、数据、算力)的迅猛发展,其中又以数据和算力的发展尤为重要。
物联网技术的蓬勃发展使得数据累计的难度越来越低,而芯片算力的不断提升,使得过去只能通过云计算才能完成的人工智能运算,现在可以下沉到最普通的设备上完成。
物联网技术为机器带来感知能力,而人工智能则通过计算算力为机器带来了决策能力,正如感知和大脑对自然生命进化所起到的必然性作用。
本章介绍数字图像的一些基础知识和基本概念,包括数字图像处理基本原理及常见方法、图像的采样和量化、图像的表示和可视化、图像中像素间的关系、黑白图像以及灰度图像。
数字图像处理是指借助计算机强大的运算能力,运用去噪、特征提取、增强等技术,对数字形式存储的图像进行加工、处理。
M*N
的网格,每个网格称为一个像素,M*N
称为图像的空间分辨率。# coding=utf-8
# 导入所需要的包
from skimage import data
from matplotlib import pylot as plt
import numpy as np
image = data.coffee() # 载入测试图像
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() # 打印采样后的图像
I(x,y)
的数字化被称为图像的量化,即将图像响应值I(x,y)
从Imax
到Imin
的实数域映射为有限级别的离散值。Python
代码如下。# coding=utf-8
from skimage import data
from matplotlib import pyplot as plt
image = data.coffee() # 载入测试图像
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) # 打印采样后的图像
plt.show()
I=(x,y)
转换为一个二维阵列f(x,y)
,该阵列具有M行N列,其中(x,y)
是离散坐标。AutoCAD
、Visio
等。使用python3.7和skimage工具包对图像可视化。与OpenCV相比,skimage更容易安装和使用,对像素的操作和图像整体的操作更符合科学计算要求。
像素间的关系主要对像素与像素之间的关联进行描述,基本关系包括像素间的领域关系、连通性、像素之间的距离。
a=1
时是原图;a>1
时对比度增强,图像看起来更加清晰。a<1
时对比度减弱,图像看起来变暗。# 针对彩色图像进行操作
import numpy as np
# 改变对比度函数
def change_alpha(im, a):
im_changed = np.zeros(shape=im.shape, dtype='uint8')
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_changed[i, j, k] = 255
elif im[i, j, k] < 0:
im_changed[i, j, k] = 0
else:
im_changed[i, j, k] = im[i, j, k] * a
return im_changed
a=1
时是原图a>1
时对比度增强,图像看起来更加清晰a<1
时对比度减弱,图像看起来变暗# coding=utf-8
from skimage import data, io
from matplotlib import pyplot as plt
# 读入图像
image = data.coffee()
# 分别取出红、绿、蓝三个颜色通道
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)
plt.show()
图像运算是以图像为单位,对图像进行的数学操作,是数字图像信号处理的基础,运算对象以像素点为基本单位,运算结果为一幅灰度分布与原图像不同的新图像。
# coding=utf-8
from matplotlib.font_manager import FontProperties
font_set = FontProperties(fname=r"c:\windows\fonts\simsun.ttc", 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()
skimage
的exposure
模块中包含幂次变换的函数adjust_gamma
,可以对图像进行幂次变换。幂次变换为非线性变换,图像中某些部分可以通过幂次变换凸显出来。# coding=utf-8
from skimage import data, io, exposure
from matplotlib import pyplot as plt
# 读入图像
image = data.coffee()
# 分别计算gamma=0.2,0.67,25时的图像
image_1 = exposure.adjust_gamma(image, 0.2)
image_2 = exposure.adjust_gamma(image, 0.67)
image_3 = 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(image_1)
plt.subplot(2, 2, 3)
plt.title('gamma=0.67')
io.imshow(image_2)
plt.subplot(2, 2, 4)
plt.title('gamma=25')
io.imshow(image_3)
plt.show()
# coding=utf-8
from skimage import data, exposure
# 读入图像
image = data.coffee()
# 计算直方图
hist_r = exposure.histogram(image[:, :, 0], nbins=256)
hist_g = exposure.histogram(image[:, :, 1], nbins=256)
hist_b = exposure.histogram(image[:, :, 2], nbins=256)
# coding=utf-8
from skimage import data, exposure
from matplotlib.pyplot as plt
# 读入图像
img = data.moon()
plt.figure('hist', figsize=(8, 8))
arr = img.flatten()
plt.subplot(2, 2, 1)
plt.imshow(img, plt.cm.gray) # 原始图像
plt.subplot(2, 2, 2)
plt.hist(arr, bins=256, normed=1, edgecolor='None', facecolor='red') # 原始图像直方图
img1 = exposure.equalize_hist(img)
arr1 = img1.flatten()
plt.subplot(2, 2, 3)
plt.imshow(img1, plt.cm.gray) # 均衡化
plt.subplot(2, 2, 4)
plt.hist(arr1, bins=256, normed=1, edgecolor='None', facecolor='red') # 均衡化直方图
本章简要介绍了数字图像处理的基本概念,介绍了基于Python进行数字图像处理的简单语法,对数字图像处理中遇到的一些基本操作及运算进行了简单实现。