[python]代码库
思路
其实这是马赛克的算法,新建图像board,宽高取整
以像素块block作为步进分别生成每行每列的新像素块
每个新像素块的颜色取像素区块内出现最多的颜色
新像素块偏移1像素留黑边
像素块贴到新建图像board上
源码比较简单
from PIL import Image
import collections
pic = Image.open("img1.jpg").convert("RGB")
width, height = pic.size
block = 10 # 小格子大小,数字越大像素粒越大
board = Image.new("RGB", (width // block * block, height // block * block)) # 新图片宽高取整
for y in range(0, height, block): # 行
for x in range(0, width, block): # 列
temp = pic.crop((x, y, x + block, y + block)) # 截取block * block区块图像
temp_list = list(temp.getdata()) # 获取像素序列并转为普通序列
max_color = collections.Counter(temp_list).most_common()[0][0] # 计算像素块颜色,取最多出现的一个颜色
temp_past = Image.new("RGB", (block - 1, block - 1), max_color) # 错开1像素 制作黑边效果
# temp_past = Image.new("RGB", (block, block), max_color) # 像素块无边框
board.paste(temp_past, (x, y))
x = x + block # 跳过无用计算
y = y + block # 跳过无用计算
board.show()
用到的库
PIL Python 图像处理库
图像处理工具包 PIL (Python Image Library), 该软件包提供了基本的图像处理功能,如:改变图像大小,旋转图像,图像格式转换,色场空间转换,图像增强,直方图处理,插值和滤波等等。
常用方法
# 读取图片
im=Image.open('/test.jpg')
# 显示图片
im.show()
# 保存图片
im.save("image.gif","GIF")
# 创建新图片
Image.new(mode,size)
Image.new(mode,size,color)
newImg = Image.new("RGBA",(640,480),(0,255,0))
newImg.save("newImg.png","PNG")
# 设置要裁剪的区域
region=im.crop(box) #region是一个新的图像对象。
# 改变图像的大小:
out=img.resize((128,128))
Python标准库collections
功能:
计数器(counter)
有序字典(orderedDict)
默认字典(defaultdict)
可命名元组(namedtuple)
双向队列(deque)
import collections
x = 'asadadawdsdasdawdasdawdawdawedwqdfrgfdrgrthrhr'
collections.Counter(x)
# 返回值:
# Counter({'d': 12, 'a': 10, 'w': 6, 'r': 5, 's': 4, 'f': 2, 'g': 2, 'h': 2, 'e': 1, 'q': 1, 't': 1}) #默认从大到小排序
collections.Counter(x).most_common() # 获取最大值
这里我们用来计算一个区域内,按颜色分组,出现次数最多的像素点
max_color = collections.Counter(temp_list).most_common()[0][0] # 计算像素块颜色,取最多出现的一个颜色
[代码运行效果截图]