数字识别、显示边缘
程序员文章站
2024-03-16 11:03:22
...
数字识别、显示边缘
要求:
①为自己自拍一张照片;
②再制作一个包含数字的图片
③读入自拍照片;调整图片尺寸为512*512;
⑤将两幅图片相加
⑥将相加后的图片变为灰度图像;
⑦检测步骤⑥中的灰度图像边缘;显示边缘图像;
实验环境:
Spyder (Anaconda3),用python中的第三方库matplotlib.pyplot,具体用什么工具都可以pycharm等
正文:
1.这里选择照片作为第一张图
2.用名字和数字来表示第二张图
3.读取照片,转化为对象,用Image.open()函数
def load_data(imgFile,nameFile):
img_data = Image.open(imgFile)
name_data = Image.open(nameFile)
return img_data,name_data
4.将两个照片相加,整理成一个对象
def combineImg(img_data,name_data):
img = Image.blend(img_data,name_data,0.3)
return img
5.将合并的照片对象转化为灰度图片
def convertToBlack(img_data):
img_data = img_data.convert('L')
return img_data
6.检测灰度边缘,并降低噪声,再将图片保存到本地
def imgTesting(image_array):
# 生成高斯算子的函数
def func(x,y,sigma=1):
return 100*(1/(2*np.pi*sigma))*np.exp(-((x-2)**2+(y-2)**2)/(2.0*sigma**2))
# 生成标准差为5的5*5高斯算子
suanzi1 = np.fromfunction(func,(5,5),sigma=5)
# Laplace扩展算子
suanzi2 = np.array([[1, 1, 1],
[1,-8, 1],
[1, 1, 1]])
# 利用生成的高斯算子与原图像进行卷积对图像进行平滑处理
image_blur = signal.convolve2d(image_array, suanzi1, mode="same")
# 对平滑后的图像进行边缘检测
image2 = signal.convolve2d(image_blur, suanzi2, mode="same")
plt.subplot(4,2,7)
plt.imshow(image2)
# 结果转化到0-255
image2 = (image2/float(image2.max()))*255
# 将大于灰度平均值的灰度值变成255(白色),便于观察边缘
image2[image2>image2.mean()] = 255
plt.subplot(4,2,8)
plt.imshow(image2)
完整代码如下:
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
import numpy as np
from PIL import Image
import scipy.signal as signal
"""
python调整图片尺寸为512*512
将两幅图片相加,变为灰度图像;
灰度图像边缘;
显示边缘图像;
"""
def load_data(imgFile,nameFile):
img_data = Image.open(imgFile)
name_data = Image.open(nameFile)
return img_data,name_data
def changTo3D(img_data):
#将图片转哈为三维数组
img3DimArr = np.array(img_data)
return img3DimArr
#或者可以直接用该表达式,可以直接将照片转化为三维数组I = mpimg.imread(imgfile)
#print(name_3_dim_array.shape)
#用来展示图片
#plt.imshow(name_3_dim_array)
#修改像素的大小
def resizeImage(image,width,height):
resizedImage=image.resize((width,height),Image.ANTIALIAS)
# plt.imshow(resizedImage)
return resizedImage
def convertToBlack(img_data):
img_data = img_data.convert('L')
return img_data
def combineImg(img_data,name_data):
img = Image.blend(img_data,name_data,0.3)
return img
def imgTesting(image_two_array):
# 生成高斯算子的函数
def gaosifunc(x,y,sigma=1):
return 100*(1/(2*np.pi*sigma))*np.exp(-((x-2)**2+(y-2)**2)/(2.0*sigma**2))
# 生成标准差为5的5*5高斯算子
gaosisuanzi1 = np.fromfunction(gaosifunc,(5,5),sigma=5)
# Laplace扩展算子
gaosisuanzi2 = np.array([[1, 1, 1],
[1,-8, 1],
[1, 1, 1]])
# 利用生成的高斯算子与原图像进行卷积对图像进行平滑处理
imageBlur = signal.convolve2d(image_two_array,gaosisuanzi1, mode="same")
# 对平滑后的图像进行边缘检测
image2 = signal.convolve2d(imageBlur, gaosisuanzi2, mode="same")
plt.subplot(4,2,7)
plt.imshow(image2)
# 结果转化到0-255
image2 = (image2/float(image2.max()))*255
# 将大于灰度平均值的灰度值变成255(白色),便于观察边缘
image2[image2>image2.mean()] = 255
plt.subplot(4,2,8)
plt.imshow(image2)
if __name__ == "__main__":
#读取数据
imgFile = "gxj1.jpg"
nameFile = 'name.jpg'
img_data,name_data=load_data(imgFile,nameFile)
plt.subplot(4,2,1)
plt.imshow(img_data)
plt.subplot(4,2,2)
plt.imshow(name_data)
resized_img_data = resizeImage(img_data,512,512)
resized_name_data = resizeImage(name_data,512,512)
plt.subplot(4,2,3)
plt.imshow(resized_img_data)
plt.subplot(4,2,4)
plt.imshow(resized_name_data)
# plt.imshow(resized_img_data)
#合并,并转化为灰度图片
img = combineImg(resized_img_data,resized_name_data)
plt.subplot(4,2,5)
plt.imshow(img)
cImg = convertToBlack(img)
plt.subplot(4,2,6)
plt.imshow(cImg)
#转为图片的三维数组
img3DimArr=changTo3D(cImg)
#图像边缘检测
edge_img=imgTesting(img3DimArr)
plt.savefig("aa.jpg",dpi=1080)
# plt.imshow(resized_name_data)
# plt.imshow(cImg)
其中大家根据需要,将图片转为不同像素(dpi=xxx)。
最终的结果如下:
上一篇: 快速排序个人笔记
下一篇: 入门 JVM 这一篇就够了
推荐阅读