思路 |
其实这是马赛克的算法,新建图像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 ] # 计算像素块颜色,取最多出现的一个颜色 |