有没有人是利用图信号处理技术进行负荷分解的啊?精度太低,误差好大,有人有相关的python代码嘛?求!
没有做课后题的源码的效果图:
-第二道题目做法:在createImageGrid
函数中创建 3*3像素的小黑块, 语句是:gap = Image.new('RGB', (3, 3))
,当然你想要其他的小块也可以,把语句更改为:gap = Image.new('RGB', (3, 3),(255, 255, 255))
(这就是小白块了),输入自己想要的R、G、B值,就可以随心所欲更改渐变颜色了。当粘贴替换图片小块后,继续贴小黑块语句是:grid_img.paste(gap, (col * width , row * height ))
,就产生了想要的效果。
小白块效果图:
源代码:
"""
打开图像,分割图像,将分割好的小块粘贴(可以只要原来的四分之一,来降低像素),保存。
"""
import os
from PIL import Image
#图像路径
target_image1 = '.\\test-data\\专属.jpg'
#分割图形
def splitImage(image, size):
"""
将图像按照网格分成多个小图像
@param {Image} image Pil Image
@return {List[Image]} 小图像列表
"""
#image = Image.open(target_image)
#获得原始图像尺寸
W, H = image.size[0], image.size[1]
# print(image.size)
# print(size[1])
#分划的小图像个数 m * n
m, n = size
#小图像的尺寸
w, h = int(W / n), int(H / m)
#分割好的小图像放在列表中
imgs = []
#遍历
for j in range(m):
for i in range(n):
#得到小图像并加入到imgs列表
imgs.append(image.crop((2 * i * w, 2 * j *h, (2 * i + 1) * w, (2 * j + 1) * h)))
return imgs
#粘贴图像
def createImageGrid(images, dims):
"""
将图形列表里的小图像按先行后列的顺序拼接为一个大图像
@param {List[Image]} images 小图像列表
@param {Tuple[int, int]} dims 大图像的行数和列数
@return Image 拼接得到的大图像
"""
m, n = dims
# #确保小图像个数满足要求
# assert m *n == len(images)
#计算小图像的最大尺寸
width = max([img.size[0] for img in images])
height = max([img.size[1] for img in images])
#创建大图像对象
grid_img = Image.new('RGB', (int(n * width / 2), int(m * height / 2 )))
#将小图像粘贴到大图像
for index in range(len(images)):
#计算要粘贴到的行
row = int(index / n)
#计算粘贴到的列
col = index - n * row
#粘贴
grid_img.paste(images[index], (col * width, row * height))
return grid_img
def main():
#打开图形
target_image = Image.open(target_image1)
#分割图形
target_images =splitImage(target_image,[128, 128])
#粘贴新图形
mosaic_image = createImageGrid(target_images, [128, 128])
#保存
output_filename = 'mosaic1.png'
#mosaic_image.save(output_filename)
mosaic_image.save('D:\python项目\\照片马赛克\\masaka1.png')
if __name__ == '__main__':
main()
原图:
块状处理后效果: