Filter基类
class Filter:#filter基类
def __init__(self,image,para):
self.image = image
self.para = para
def filter(self,im):#filter函数,但是并不需要在基类里实现,使用pass表示忽略报错
pass
子类
class Edge(Filter):
def __init__(self,image,para):
super( Edge,self).__init__(image,para)
def filter(self,im):
im=im.filter(ImageFilter.EDGE_ENHANCE)#增强边,有利于提取边
im2=im.filter(ImageFilter.FIND_EDGES)
return im2
class Sharpen(Filter):
def __init__(self, image, para):
super(Sharpen, self).__init__(image, para)
def filter(self,im):
im2 = im.filter(ImageFilter.SHARPEN)
return im2
class Vague(Filter):
def __init__(self, image, para):
super(Vague, self).__init__(image, para)
def filter(self,im):
im2 = im.filter(ImageFilter.BLUR)
return im2
class Size(Filter):
def __init__(self,image,para):
super(Size,self).__init__(image,para)
def filter(self,im):
im2=im.resize((round(im.size[0]*1.5), round(im.size[1]*1.5)))
return im2
ImageShop
class ImageShop:
def __init__(self,format,file,lis_im,process,image=0,para=(1,1)):#image和para可以不传参
self.format=format
self.file=file
self.lis_im=lis_im
self.process=process
self.image=image
self.para=para
def load_image(self):
self.lis_im = glob.glob(os.path.join(self.file, '*' + self.format))#匹配文件中的所有特定格式的文件
#
def __batch_ps(self,Filter):#Filter表示一个实例对象,这个函数为私有函数,只能在类内调用,这个类内方法将在外部函数内调用
for i in range(len(self.process)):
self.process[i]=Filter.filter(self.process[i])#对所有图片进行操作
def bach_ps(self,Filter,*args):
ImageShop.load_image(self)#导入所有图片路径,类内调用内部函数需要加入self参数
for path in self.lis_im:#对所有的图片路径进行遍历
self.process.append(Image.open(path))#此时图片都已经保存在列表中
if Filter=="Edge":
Fi=Edge(self.image,self.para)#先做一个简单的初始化
for i in range(len(self.process)):
self.process[i]=Fi.filter(self.process[i])
elif Filter=="Sharpen":
Fi = Sharpen(self.image, self.para) # 先做一个简单的初始化
for i in range(len(self.process)):
self.process[i] = Fi.filter(self.process[i])
elif Filter=="Vague":
Fi = Vague(self.image, self.para) # 先做一个简单的初始化
for i in range(len(self.process)):
self.process[i] = Fi.filter(self.process[i])
elif Filter=="Size":
Fi = Size(self.image, self.para) # 先做一个简单的初始化
for i in range(len(self.process)):
self.process[i] = Fi.filter(self.process[i])
else:
print("Don't have this method")
if len(args)>0:
for item in args:#调用方法
if item == "Edge":
Filter = Edge(self.image, self.para) # 先做一个简单的初始化
ImageShop.__batch_ps(self, Filter)#调用实例自身,其实在调用各种模块的时候已经用过类似的方法
elif item == "Sharpen":
Filter = Sharpen(self.image, self.para)
ImageShop.__batch_ps(self, Filter)
elif item == "Vague":
Filter = Vague(self.image, self.para)
ImageShop.__batch_ps(self, Filter)
elif item == "Size":
Filter = Size(self.image, self.para)
ImageShop.__batch_ps(self, Filter)
else:
print("Don't have this method")
def display(self):
x=self.para[0]
y=self.para[1]
for i in range(len(self.process)): #表示一页每次最多展示x*y张图片
if i<(x*y):
im=self.process[i]
plt.subplot(x, y, i + 1) # 表示第i张图片,下标只能从1开始,不能从0,
plt.imshow(im)
# 下面两行是消除每张图片自己单独的横纵坐标,不然每张图片会有单独的横纵坐标,影响美观
plt.xticks([])
plt.yticks([])
else:
break
plt.show()#显示x*y张图片
time.sleep(5)#沉睡5秒后自动关闭,不然后续程序无法运行
plt.close()
def save(self,path):
for i in range(len(self.process)):
im=self.process[i]
im.save(path+"{}".format(i)+self.format)
TestImageShop
class TestImageShop:
def __init__(self,format,file,lis_im,process,image,para):
self.FILE=ImageShop(format,file,lis_im,process,image=image,para=para)
def bach_ps(self,Filter,*args):
self.FILE.bach_ps(Filter,*args)#调用可变长度参数时需要加入*
def save(self,path):
self.FILE.save(path)
def display(self):
self.FILE.display()
main
import glob
import os
import matplotlib.pyplot as plt
from PIL import Image, ImageFilter
import time
def main():
format=".jpg"
file="D:\\经管大三\\现代程序设计\\week6\\images"
path="D:\\经管大三\\现代程序设计\\week6\\save_images\\"
lis_im,process=[],[]
image=0
para=(3,4)
test=TestImageShop(format,file,lis_im,process,image,para)
test.bach_ps("Sharpen","Size","Edge")
test.display()
test.save(path)
if __name__ == '__main__':
main()
需要说明的是,文件读入和images文件夹中的显示顺序不一样
附加题
卷积神经网络——滤波器的意义:卷积神经网络理解(一):滤波器的意义 (qq.com)
滤波器就是对遍历图像的各个局部区域,并对各个区域利用滤波器(一个由CNN自动生成的m * n的矩阵)进行点乘,从而达到对图片进行各种处理的效果。因为我们知道,图片在计算机内的处理是一个m * n * 3的矩阵,图像处理就是基于这个矩阵产生的。
线性滤波、高斯滤波等一些滤波器的基本原理:(3条消息) 【图像处理】图像滤波_DawN、的博客-优快云博客
四种图像滤波算法实现及原理解析 - 知乎 (zhihu.com)
相似度计算
(3条消息) 图像直方图均衡化:Python实现直方图均衡化、直方图相似度检测、Python实现直方图反向投影_toxin_的博客-优快云博客_直方图均衡化优化
源码来自:(3条消息) 【python 图片相似度】直方图计算图片相似度_东华果汁哥的博客-优快云博客_直方图相似度
采用直方图计算图片相似度(包括RGB),提取边,锐化等操作时相似度下降较多
import matplotlib.pyplot as plt
import glob
import os
from PIL import Image
def make_regalur_image(img, size=(256, 256)):
"""我们有必要把所有的图片都统一到特别的规格,在这里我选择是的256x256的分辨率。"""
return img.resize(size).convert('RGB')
def hist_similar(lh, rh):
assert len(lh) == len(rh)
return sum(1 - (0 if l == r else float(abs(l - r))/max(l, r)) for l, r in zip(lh, rh))/len(lh)
def calc_similar(li, ri):
return sum(hist_similar(l.histogram(), r.histogram()) for l, r in zip(split_image(li), split_image(ri))) / 16.0
def calc_similar_by_path(lf, rf):
li, ri = make_regalur_image(Image.open(lf)), make_regalur_image(Image.open(rf))
return calc_similar(li, ri)
def split_image(img, part_size = (64, 64)):
w, h = img.size
pw, ph = part_size
assert w % pw == h % ph == 0
return [img.crop((i, j, i+pw, j+ph)).copy() for i in range(0, w, pw) \
for j in range(0, h, ph)]
def main():
path="D:\\经管大三\\现代程序设计\\week6\\images"
path2="D:\\经管大三\\现代程序设计\\week6\\save_images"
lis_im = glob.glob(os.path.join(path, '*' + ".jpg"))
lis_im_2=glob.glob(os.path.join(path2, '*' + ".jpg"))
lis_sim=[]
for i in range(len(lis_im)):
img1_path = lis_im[i]
img2_path = lis_im_2[i]
similarity = calc_similar_by_path(img1_path, img2_path)
lis_sim.append(similarity)
print(f"第{i:}对图片相似度为:{similarity:}")
plt.plot(lis_sim)
plt.show()
if __name__=="__main__":
main()
下图为各图的相似度分布,我们可以发现将图片锐化,方法,提取边以后,两图相似度下降很多
图像预处理可以过滤掉与机器学习无关的因素,可以去除图片的噪音,增强某些方面的特征,有利于下游机器学习的模型建立,提高准确度。
深度卷积网络
(4条消息) 深度卷积神经网络基本介绍_mixiumixiu的博客-优快云博客_深度卷积神经网络是什么
(4条消息) 深度卷积神经网络(CNN)_Good@dz的博客-优快云博客_深度卷积神经网络
CNN)_Good@dz的博客-优快云博客_深度卷积神经网络](https://blog.youkuaiyun.com/qq_42178122/article/details/116641874?ops_request_misc=&request_id=&biz_id=102&utm_term=深度卷积神经网络是什么&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-1-116641874.nonecase&spm=1018.2226.3001.4187)