Python 实现图像合成微缩效果
作者:AI 发布时间:2023-08-19 22:15:16
合成微缩效果
前言
图像中的模糊效果可以强烈影响被拍摄场景的感知,模糊在传达所需的尺寸和距离感方面起着重要作用。合成微缩 (miniature faking
) 是一个使真实大小物体照片看起来像微缩模型照片的过程,也称为 Diorama Effect/Fillusion
,照片的模糊部分模拟了通常在特写摄影中通常遇到的近景深度,从而使场景看起来比实际场景小得多。
图像微缩效果原理
应用模糊近似于浅的景深可以合成微缩效果。当图像很大并从短距离观看时,效果更为明显。在本节中,我们将学习如何使用 PIL
库在图像中创建微缩效果。
使用掩码可以选择应重点关注的焦点对象,本节中我们使用的二值掩码具有在对象交点处为黑色像素,而其他位置为白色像素。将高斯模糊应用到图像上,然后使用掩码从原始图像或模糊图像中选择合适的像素。
为了模拟场景效应的深度,需要在图像中多次应用高斯模糊,然后使用形态学运算腐蚀缩放的掩码来重复高斯模糊过程,这将在模糊后的掩码中产生线性梯度。同时,还需要增强图像的颜色和亮度。
实现图像微缩效果
(1) 首先,导入所有必需的库:
from PIL import Image, ImageEnhance, ImageFilter
from scipy.ndimage import binary_erosion
from PIL.ImageFilter import GaussianBlur
import matplotlib.pyplot as plt, numpy as np
(2) 使用形态学腐蚀缩放后的掩码图像,然后通过使用给定半径迭代应用高斯模糊 GaussianBlur()
。每次重复应用掩码都会对高斯模糊进行扩大,以确保梯度模糊,并增加模糊程度:
def apply_gradient_blur(image, mask, n=10, radius=1):
mask = mask.convert("1")
for i in range(n):
mask = binary_erosion(np.array(mask), structure=np.ones((10,10)), border_value=1)
im_blur = image.filter(GaussianBlur(radius=radius))
image.paste(im_blur, mask=Image.fromarray(mask))
return image
(3) 接下来,根据函数 apply_gradient_blur()
定义函数 create_fake_miniature()
创建合成微缩效果,在函数中,使用 pil.imageenhance
模块的 Color()
和 Contrast()
函数增强图像的颜色和对比度,然后使用 apply_gradient_blur()
函数将梯度模糊应用于焦点外部的区域(即对应于掩码中的白色像素);最后,将增强的图像(焦点区域)与模糊图像(焦点外部区域)合并:
def create_fake_miniature(im, custom_mask, color=1.9, contrast=1.4, blur_radius=1.3):
# 提高对比度和颜色
edited = ImageEnhance.Contrast(ImageEnhance.Color(im).enhance(color)).enhance(contrast)
# 模糊图像并合并
im_blur = apply_gradient_blur(edited.copy(), mask.copy(), n=50, radius=blur_radius)
edited = edited.convert("RGBA")
edited.paste(im_blur, mask=mask)
return edited
(4) 使用 pil image.open()
函数读取输入图像和掩码图像(焦点区域)作为输入创建合成微缩效果。绘制输入图像:
im = Image.open("9.png")
mask = Image.open("9_binary.png")
out = create_fake_miniature(im, mask)
plt.figure(figsize=(20,10))
plt.imshow(im), plt.axis('off'), plt.title('Original image', size=10)
plt.show()
(5) 绘制二值掩码图像:
plt.figure(figsize=(10,10))
plt.imshow(mask), plt.axis('off'), plt.title('(Bell Whistles) Mask image', size=10)
plt.show()
(6) 最后,绘制合成微缩效果输出图像如下:
plt.figure(figsize=(20,10))
plt.imshow(out), plt.axis('off'), plt.title('Fake Miniature image', size=10)
plt.show()
从上图中可以看出,焦点中的建筑物似乎距离镜头更近了。
来源:https://blog.csdn.net/qq_30167691/article/details/128226148
猜你喜欢
- BootStrap模态框简单概述Bootstrap Modals(模态框)是使用定制的 Jquery 插件创建的。它可以用来创建模态窗口丰富
- 如何做一个文本书写器?我们有下面的的函数,可做“文本书写器”:<%function WriteToFile(FileName
- Bit-Packed Data TypesMySQL有一些存储类型使用一个值中的一些单个的比特位来紧凑的存储数据。纯技术上将,不管是底层的存
- Erase语句:重新初始化固定数组的元素,并释放动态数组的存储空间。用法: Era
- 找了国内30个比较著名的网站的注册表单做样本,对标签和输入区对齐方式做了统计,得到了一个结论:标签水平右对齐更适合中文网站,或者说右对齐更适
- 数据安全是任何数据服务解决方案中的一个关键要求,而Windows Server 2008和SQL Server 2008结合起来,通过一个基
- 用Python+ChatGPT批量生成论文概述做算法研究离不开阅读大量论文。从海量论文中找到需要的论文往往耗费算法团队不少的精力。ChatG
- 本文实例讲述了Python使用Selenium模块模拟浏览器抓取斗鱼直播间信息。分享给大家供大家参考,具体如下:import timefro
- 使用JavaScript写的一个旋转的彩圈效果图<!DOCTYPE html><html><head>&
- 程序代码: '关键字的搜索 str="select * from tableNam
- python数据类型之间怎么转换?数据如果类型不对,在运行中有交集的话就会出现错误,那怎么让两个类型的数据变成同一个类型的呢首先是字符串,在
- 1.删除所有的目录,只保留datasharebin2.删除BIN下面除以下三个文件之外的所有文件:libmysql.dll(MYSQL5中的
- 前言当我们需要对列表(list)、元组(tuple)、字典(dictionary)和集合(set)的元素进行遍历时,其实Python内部都是
- 首先你要确定错误的原因: 让IE显示详细的出错信息: 菜单--工具--Internet选项--高级--显示友好的HTTP错误信息,去掉这个选
- 鼠标双击滚动屏幕,单击停止滚动,很多小说新闻网站都有这个很人性化的功能,阅读起小说、新闻来很方便,不用手动拉滚动条。js代码如下:<h
- 首先忠心感谢凌宇5942给我的帮助!在他的启迪下我发现了另一种实现flash透明背景的办法,愿与大家共同探讨:凌宇5942告知的解决办法:在
- 如何提高Request集合的使用效率?以加快程序处理速度: strTitle=Request.Form("Title&q
- # 有时候我们提前知道了一个数组的大小,需要给每个元素赋值,此时append好像不管用。我们需要定义一个定# # 长的数组,python中代
- 先简单做个分享,有时间再补一个完整的用例self.textEdit = QtGui.QTextEdit(slef)1.设置背景颜色self.
- 读取nc数据相关信息#导入库import netCDF4from netCDF4 import Dataset#读取数据文件nc