加入收藏 | 设为首页 | 会员中心 | 我要投稿 上海站长网 (https://www.021zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

python实现图片处理和特征提取详解

发布时间:2022-10-14 06:01:05 所属栏目:PHP教程 来源:转载
导读: 最近在研究深度学习视觉相关的东西,经常需要写python代码搭建深度学习模型。比如写CNN模型相关代码时,我们需要借助python图像库来读取图像并进行一系列的图像处理工作。我最常用的图像库

最近在研究深度学习视觉相关的东西,经常需要写python代码搭建深度学习模型。比如写CNN模型相关代码时,我们需要借助python图像库来读取图像并进行一系列的图像处理工作。我最常用的图像库当然是opencv,很强大很好用,但是opencv也有一些坑,不注意的话也会搞出大麻烦。近期我也在看一些别人写的代码,因为个人习惯不一样,他们在做深度学习时用于图片读取的图像库各不相同,从opencv到PIL再到skimage等等各种库都有,有些库读进来的图片存储方式也不太一样,如果不好好总结这些主流图像读写库特点的话,以后看代码写代码都会遇坑无数。这篇文章就总结了以下主流Python图像库的一些基本使用方法和需要注意的地方:

1.opencv

2.PIL(pillow)

3.matplotlib.image

4.scipy.misc

5.skimage

opencv: cv2.imread

opencv作为我最常用的图像处理库,当然第一个介绍,并且介绍得比较全面。毋庸置疑,opencv是今天介绍得所有图像库中最全面也最强大的库,如果我们只想掌握一个图像库,我觉得opencv库肯定是

11import cv2

import numpy as np6

图像二值化操作

_, binary_image = cv.threshold(gray_image, 127, 255, cv.THRESH_BINARY)

图像水平切分

_, columns = binary_image.shape

space = int(columns / 4.)

for i in range(0,4):

char_images.append(binary_image[:,i*space:(i+1)*space])

图像尺寸缩放

for image in char_images:

resized_images.append(cv.resize(image, (20,20)))

#读入图片:默认彩色图,cv2.IMREAD_GRAYSCALE灰度图,cv2.IMREAD_UNCHANGED包含alpha通道

img = cv2.imread('1.jpg')

cv2.imshow('src',img)

print(img.shape) # (h,w,c)

print(img.size) # 像素总数目

print(img.dtype)

print(img)

cv2.waitKey()

值得注意的是,opencv读进来的图片已经是一个numpy矩阵了,彩色图片维度是(高度,宽度,通道数)。数据类型是uint8。

10#gray = cv2.imread('1.jpg',cv2.IMREAD_GRAYSCALE) #灰度图

#cv2.imshow('gray',gray)

#也可以这么写,先读入彩色图,再转灰度图

src = cv2.imread('1.jpg')

gray = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)

cv2.imshow('gray',gray)

print(gray.shape)

print(gray.size)

print(gray)

cv2.waitKey()

上面提到了两种获取灰度图的方式,读进来的灰度图的矩阵格式是(高度,宽度)。

3#注意,计算图片路径是错的,Opencv也不会提醒你,但print img时得到的结果是None

img2 = cv2.imread('2.jpg')

print(img2)

4#如何解决“读到的图片不存在的问题”? #加入判断语句,如果为空,做异常处理

img2 = cv2.imread('2.jpg')

if img2 == None:

print('fail to load image!')

图片矩阵变换

opencv读入图片的矩阵格式是:(height,width,channels)。而在深度学习中,因为要对不同通道应用卷积,所以会采取另一种方式:(channels,height,width)。为了应对该要求,我们可以这么做

5#注意到,opencv读入的图片的彩色图是一个channel last的三维矩阵(h,w,c),即(高度,宽度,通道)

#有时候在深度学习中用到的的图片矩阵形式可能是channel first,那我们可以这样转一下

print(img.shape)

img = img.transpose(2,0,1)

print(img.shape)

在深度学习搭建CNN时,往往要做相应的图像数据处理,比如图像要扩展维度,比如扩展成(batch_size,channels,height,width)。

对于这种要求,我们可以这么做。

3#有时候还要扩展维度,比如有时候我们需要预测单张图片,要在要加一列做图片的个数PHP图像处理,可以这么做

img = np.expand_dims(img, axis=0)

print(img.shape)7

图片验证码识别

for image in all_images:

accuracy = predict(sess, image['features'])

print("验证码图片【{}】,识别结果为:{}".format(image['picture_name'], accuracy))

上面提到的是预测阶段时预测单张图片的扩展维度的操作,如果是训练阶段,构建batch,即得到这种形式:(batch_size,channels,height,width)。我一般喜欢这么做

5data_list = []

loop:

im = cv2.imread('xxx.png')

data_list.append(im)

data_arr = np.array(data_list)

这样子就能构造成我们想要的形式了。

图片归一化

5#因为opencv读入的图片矩阵数值是0到255,有时我们需要对其进行归一化为0~1

img3 = cv2.imread('1.jpg')

img3 = img3.astype("float") / 255.0 #注意需要先转化数据类型为float

print(img3.dtype)

print(img3

(编辑:上海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!