理解机器存储图像逻辑:
上图是一个简单的表示“8”的图片,可被用来做为识别验证码
它由一个个或白或灰或黑的小色块所组成,每一个小色块的长度和面积都相同,仅在亮度方面有所分别,它们是计算机表示的基本单元:像素点
其在计算机中的表示形式如下:
每一个像素对应(0-255)的灰度模式,0为黑色,255为白色
所有的像素点以一种特定的规律组合在一起,才形成一张图片
计算机以矩阵的方式存储图片,矩阵的大小取决于图片的像素点数量,一般来说,固定面积下,图片的像素点数量越多,图片质量越高,存储所需的矩阵也就越大,从而占用的计算机资源也就越多
除了灰度模式表示外,计算机还有另外一种图像的表示方法:RGB模式
Red(0-255),Green(0-255),Blue(0-255)
由这三种颜色的组合,可模拟丰富多彩的各种现实世界的图像
使用python进行图像特征提取:
(一)灰度像素值作为特征
从图像创建特征的最简单方法是将这些原始像素值用作单独的特征。
image = imread('puppy.jpeg', as_gray=True) image.shape
(650, 450
image.shape返回图片经过灰度处理后的像素点分布数量
650*450=292500
这292500个像素点就可以算作图像最原始的特征
features = np.reshape(image, (650*450))
features.shape, features
(292500,) array([0.96470588, 0.96470588, 0.96470588, ..., 0.96862745, 0.96470588, 0.96470588])
(二)通道的平均像素值
上面是以黑白像素点组成的灰度像素分布,如果想要保留原本的彩色特征呢?
image = imread('puppy.jpeg') image.shape
(650, 450, 3)
与上面相比,此次获得的像素点为650*450*3达到了877500
这里的3就是通道数,分别代表RGB三个通道
计算通道的平均像素值:
for i in range(0,image.shape[0]): for j in range(0,image.shape[1]): feature_matrix[i][j] = ((int(image[i,j,0]) + int(image[i,j,1]) + int(image[i,j,2]))/3)
features = np.reshape(feature_matrix, (650*450))
features.shape
(292500,)
(三)边缘特征
假设有如下的图片:
我们需要分别提取图像的中的物体,这个时候使用简单的像素特征或是色彩通道均值特征都很难做到区分
这里,就需要用到边缘特征
边缘特征是什么?
如下图:
在一个具有图像变化的图片中,图像强度快速变化往往就称为图像边缘
如下图:
其中的数字就代表像素值,在计算机处理时,可以通过判断中心像素点周围的像素值差值从而判断中心像素点是否处在图像边缘
如图中的像素点85周围,相互差值(89-78/68-56)都只在15以内,亮度变化并不明显,所以可以判断85像素点不处在像素边缘
那么什么样的情况算处在图像边缘呢?
如下图:
125像素点周围,相互差值(111-68/96-89)最大的已经达到了43,这种程度的亮度变化已经可以被肉眼识别到了,就此可以判断125像素点处于图像边缘
用python识别图像边缘:
#importing the required libraries import numpy as np from skimage.io import imread, imshow from skimage.filters import prewitt_h,prewitt_v import matplotlib.pyplot as plt %matplotlib inline #reading the image image = imread('puppy.jpeg',as_gray=True) #calculating horizontal edges using prewitt kernel edges_prewitt_horizontal = prewitt_h(image) #calculating vertical edges using prewitt kernel edges_prewitt_vertical = prewitt_v(image) imshow(edges_prewitt_vertical, cmap='gray')
参考资料
https://www.analyticsvidhya.com/blog/2019/08/3-techniques-extract-features-from-image-data-machine-learning-python/?#
https://wlgls.github.io/posts/%E7%AC%AC%E4%BA%8C%E8%8A%82-%E8%AE%A1%E7%AE%97%E6%9C%BA%E8%A7%86%E8%A7%89-%E8%BE%B9%E7%BC%98%E6%A3%80%E6%B5%8B