欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数字识别、显示边缘

程序员文章站 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)。
最终的结果如下:
数字识别、显示边缘