通过python和两张图片实现漫天蝴蝶飞舞的合成图像
学校里的老师要求用python语言实现漫天蝴蝶飞舞的合成图像,在网上找不到这道题,找到类似的也是用matlab写的。
然后自己写完之后觉得展示的效果还不错,就分享出来让有需要的同学来参考参考。
原题如下:
接下来是我的代码:
import cv2 import random import matplotlib.pyplot as plt from skimage import io, transform import numpy as np def cuoqie(imge): # 错切函数 m1, m2 = imge.shape[:2] q = random.randint(0, 3) if q == 0: cc = random.random() vv = random.random() x, y = 0, 0 elif q == 1: cc = -random.random() vv = random.random() x, y = -cc * m1, 0 elif q == 2: cc = -random.random() vv = -random.random() x, y = -cc * m1, -vv * m2 else: cc = random.random() vv = -random.random() x, y = 0, -vv * m2 shearM = np.array([ [1, cc, x], [vv, 1, y] ], dtype=np.float32) img_shear = cv2.warpAffine(imge, shearM, dsize=(int(m2 + abs(cc * m1)), int(m1 + abs(vv * m2)))) return img_shear def xuanzhuan(imge): # 旋转函数 xz = random.randint(0, 360) imge = transform.rotate(imge, xz, resize=True) return imge def daxiao(imge, y, x): # 大小函数 wz = random.randint(2, 5) # 随机缩小倍数 y1, x1 = int(y / wz), int(x / wz) # 新的图片尺寸 imge = transform.resize(imge, (y1, x1)) # 缩小后的图片 return imge, y1, x1 def weiyi(imge, y1, x1, mz, my): # 随机位移函数 x2, y2 = random.randint(1, mz - x1), random.randint(1, my - y1) # 选择随机位置 mat_translation = np.float32([[1, 0, x2], [0, 1, y2]]) # 变换矩阵:设置平移变换所需的计算矩阵:2行3列 dst = cv2.warpAffine(imge, mat_translation, (x1 + x2, y1 + y2)) return dst def pingjie(butterfly, massif): # 拼接图片 m1, m2, m3 = butterfly.shape for h in range(m1): for w in range(m2): for z in range(m3): if not butterfly[h, w, z] <= 30 / 255: massif[h, w, z] = butterfly[h, w, z] * 255 else: massif[h, w, z] = massif[h, w, z] return massif def tongdao(butterfly): # 交换色彩通道的函数 s = [] while (len(s) < 2): x = random.randint(0, 2) if x not in s: s.append(x) p, q = s[:] m1, m2 = butterfly.shape[:2] for h in range(m1): for w in range(m2): n = butterfly[h, w, :] butterfly[h, w, p] = n[q] butterfly[h, w, q] = n[p] return butterfly def img_mian(butterfly, massif): # 主函数 num = random.randint(10, 25) # 设置随机数量的蝴蝶 y, x = butterfly.shape[0:2] # 的到蝴蝶图片的高和宽 my, mz = massif.shape[0:2] for i in range(num): butterfly1 = cuoqie(butterfly) # 对图片进行随机错切 butterfly2 = xuanzhuan(butterfly1) # 对图片进行随机旋转 butterfly3, y1, x1 = daxiao(butterfly2, y, x) # 对图片进行随机缩小 butterfly4 = weiyi(butterfly3, y1, x1, mz, my) # 对图片进行随机位移 butterfly5 = tongdao(butterfly4) # 随机交换两个色彩通道 massif = pingjie(butterfly5, massif) # 对图片进行拼接 return massif if __name__ == __main__: massif = io.imread(./image.jpeg) butterfly = io.imread(./image.png) beautiful_pt = img_mian(butterfly, massif) # 调用主函数 plt.imshow(beautiful_pt.astype(uint8)) plt.show()
下面就是运行的结果了:
上一篇:
多线程四大经典案例
下一篇:
java经典算法-字符串(一)