基于图像处理的类的继承学习

在这里插入图片描述

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文件夹中的显示顺序不一样

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WSIp9UD1-1665400702486)(C:\Users\kerrla\AppData\Roaming\Typora\typora-user-images\image-20221008101939608.png)]

在这里插入图片描述

附加题

卷积神经网络——滤波器的意义:卷积神经网络理解(一):滤波器的意义 (qq.com)

滤波器就是对遍历图像的各个局部区域,并对各个区域利用滤波器(一个由CNN自动生成的m * n的矩阵)进行点乘,从而达到对图片进行各种处理的效果。因为我们知道,图片在计算机内的处理是一个m * n * 3的矩阵,图像处理就是基于这个矩阵产生的。

线性滤波、高斯滤波等一些滤波器的基本原理:(3条消息) 【图像处理】图像滤波_DawN、的博客-CSDN博客

四种图像滤波算法实现及原理解析 - 知乎 (zhihu.com)

相似度计算

(3条消息) 图像直方图均衡化:Python实现直方图均衡化、直方图相似度检测、Python实现直方图反向投影_toxin_的博客-CSDN博客_直方图均衡化优化

源码来自:(3条消息) 【python 图片相似度】直方图计算图片相似度_东华果汁哥的博客-CSDN博客_直方图相似度

采用直方图计算图片相似度(包括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的博客-CSDN博客_深度卷积神经网络是什么

(4条消息) 深度卷积神经网络(CNN)_Good@dz的博客-CSDN博客_深度卷积神经网络

CNN)_Good@dz的博客-CSDN博客_深度卷积神经网络](https://blog.csdn.net/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)

(4条消息) 学习笔记 | 深度卷积神经网络在计算机视觉中的应用_Java烂笔头any的博客-CSDN博客

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值