Python工具系列之给图片指定位置范围打上马赛克

今天带来的代码是关于图片处理的,近期接触的,不是很熟悉

今天写了代码的唯一感触就是对图片数组的理解要深入了一点

图片的每一个像素点由一个rgb数组标识,通过numpy库的数组工具可以对数组进行批处理(今天主要用到的是范围性质的值修改操作)

  • 主要提供两个方法:建议用第二种
  • 方法一:随机生成一个颜色rgb数组,将随机值赋值图片指定位置
  • 方法二:通过获取图片范围块的一个rgb颜色值(我方法里面使用的是获取中心点颜色值的操作),方法提供了每次取块大小的参数(depts),该参数值越小,每次处理的单元块越精确,但是偏小的话过度精密,具体适合的值自己测试
  • 以下为代码部分,多有不足,欢迎私信探讨
import numpy as np
from PIL import Image
import random

'''
    @Author:王磊
    @Time  :2018/11/15 12:30:05
'''


def getRandArr():
    '''返回随机颜色数组'''
    return np.full((1, 3), random.randint(0, 255))


def method1(depts, start, end):
    '''
    :param depts: 马瑟克块元素大小
    :param start: 马赛克横坐标起点元组
    :param end: 马赛克纵坐标起始点元组
    :return:
    '''
    im1 = np.array(Image.open("C:\\Users\\asus\\Desktop\\img\\statue_small.jpg"))
    for i in range(start[0], start[1], depts):
        for j in range(end[0], end[1], depts):
            im1[i:i + depts, j:j + depts] = getRandArr()
    im2 = Image.fromarray(im1.astype("uint8"))
    im2.show()


def method2(depts, start, end):
    '''
    :param depts: 马瑟克块元素大小
    :param start: 马赛克横坐标起点元组
    :param end: 马赛克纵坐标起始点元组
    :return:
    主要通过中间值的rgb对局部范围块的rgb做修改,depts值越小越精确
    '''
    im1 = np.array(Image.open("C:\\Users\\asus\\Desktop\\img\\statue_small.jpg"))
    for i in range(start[0], start[1], depts):
        for j in range(end[0], end[1], depts):
            im1[i:i + depts, j:j + depts] = im1[i + (depts // 2)][j + (depts // 2)]
    im2 = Image.fromarray(im1.astype("uint8"))
    im2.show()


if __name__ == '__main__':
    '''相对方法来说,方法2更实用'''
    '''方法1(通过随机颜色值对选中范围打马赛克)'''
    #method1(20, (200, 300), (140, 240))
    '''方法2(通过选中范围的中间值颜色数组打马赛克)'''
    method2(15, (200, 300), (140, 240))

♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪
♪♪后续会更新系列小工具教程,欢迎关注探讨。♪♪
♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪♪

你可能感兴趣的:(Python)