python的N个小功能(高斯模糊原理及实践)

原理:

二维高斯函数

  

1)         为了计算权重矩阵,需要设定σ的值。假定σ=1.5,则模糊半径为1的权重矩阵如下:

 

2)         这9个点的权重总和等于0.4787147,如果只计算这9个点的加权平均,还必须让它们的权重之和等于1,因此上面9个值还要分别除以0.4787147,得到最终的权重矩阵。

 

有了权重矩阵,就可以计算高斯模糊的值了。

3)         假设现有9个像素点,灰度值(0-255)如下:

 

4)         每个点乘以自己的权重值:

 

5)         得到

 

将这9个值加起来,就是中心点的高斯模糊的值。

对所有点重复这个过程,就得到了高斯模糊后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯模糊。

 

############################################################################################高斯模糊,按照给定的txt文档每4个数据模糊相应位置#################

###############################################################################

# -*- coding: utf-8 -*-

"""

Created on Tue Mar 07 14:00:00 2017

 

@author: sl

"""

 

 

import os

from PIL import Image, ImageFilter

 

class MyGaussianBlur(ImageFilter.Filter):

  name = "GaussianBlur"

 

  def __init__(self, radius=2, bounds=None):

    self.radius = radius

    self.bounds = bounds

 

  def filter(self, image):

    if self.bounds:

      clips = image.crop(self.bounds).gaussian_blur(self.radius) ###图片的最前头拷贝一部分图片(使用crop函数),进行高斯模糊处理

      image.paste(clips, self.bounds)  ###粘贴到需要修改的图片上,来完成相应覆盖

      return image

    else:

      return image.gaussian_blur(self.radius)

 

image = Image.open(r"G:\test.jpg")

i=0

a=0

b=0

c=0

d=0

j=0

num=0

 

for line in open(r"G:\a.txt"):

  j=j+1

 

num=j

if num!=0:

  for line in open(r"G:\a.txt"):

    i=i+1

    if((i%4)==1):

      a=int(line)

    elif((i%4)==2):

      b=int(line)

    elif((i%4)==3):

      c=int(line)

    else:

      d=int(line)

      if((i%num)==4):

       

        h=min(20,int((c-a)/4))

        w=min(20,int((d-b)/4))

        bounds = (a+h,b+w,c-h,d-w)

        image = image.filter(MyGaussianBlur(radius=29, bounds=bounds))

      elif((i%num)==8):

        h=min(5,int((c-a)/4))

        w=min(5,int((d-b)/4))

        bounds = (a+h,b+w,c-h,d-w)

        image = image.filter(MyGaussianBlur(radius=29, bounds=bounds))

       

      else:

        h=min(10,int((c-a)/4))

        w=min(10,int((d-b)/4))

        bounds = (a+h,b+w,c-h,d-w)

        image = image.filter(MyGaussianBlur(radius=29, bounds=bounds))

 

if num==16:

  image.save('G:\\aaa.jpg')

else:

  image.save('G:\\pp\\aaa.jpg')

posted @ 2017-03-07 14:36  白鹭倾城  阅读(3567)  评论(0编辑  收藏  举报