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


猜你喜欢
- 平时见到的url参数都是key-value, 一般vlaue都是字符串类型的如果有幸和我一样遇到字典,列表等参数,那么就幸运了python2
- 使用QMoive方法实现导入库文件from PyQt5 import QtCore, QtGui, QtWidgetsfrom PyQt5.
- 前言如何通过python实现邮件解析?邮件的格式十分复杂,主要是mime协议,本文主要是从实现出发,具体原理可以自行研究。一、安装通过mai
- 目录1.在app下的models.py中创建新的模板2.数据迁移(用pycharm自带的Terminal工具即可)3.在app下的views
- Flask Script扩展提供向Flask插入外部脚本的功能,包括运行一个开发用的服务器,一个定制的Python shell,设置数据库的
- python调用文件时找不到相对路径current_path = os.path.dirname(__file__)if current_p
- 首先要说的是python中的除法运算,在python 2.5版本中存在两种除法运算,即所谓的true除法和floor除法。当使用x/y形式进
- 最近在使用webpack + vue做个人娱乐项目时,发现npm run build后,css js img静态资源文件均找不到路径,报40
- 在Python的标准库中,functools库中有很多对方法有操作的封装功能,partial Objects就是其中之一,他可以实现对方法参
- 本文要介绍的爬虫是抓取暴走漫画上的GIF趣图,方便离线观看。爬虫用的是python3.3开发的,主要用到了urllib、request和Be
- @StartIndex为当前页起始序号,@EndIndex为当前页结束记录序号,可以直接作为参数输入,也可以通过输入PageSize和Pag
- Python可以使用 xml.etree.ElementTree 模块从简单的XML文档中提取数据。 为了演示,假设你想解析Planet P
- 本文实例讲述了Python基于递归算法实现的走迷宫问题。分享给大家供大家参考,具体如下:什么是递归?简单地理解就是函数调用自身的过程就称之为
- 这篇博客主要是为了学习Python和PyQt,因为对棋类游戏比较热衷,所以从规则较简单的五子棋入手,利用PyQt5实现图形界面,做一个可以进
- 一:背景以及项目结构介绍第一次将自己做的python爬虫项目打包成exe,搜了很多网上教程,大部分都是打包一个py文件的小demo,这里先给
- 本文实例讲述了python中bisect模块用法,分享给大家供大家参考。具体方法分析如下:这个模块只有几个函数,一旦决定使用二分搜索时,立马
- 在现代的 web 框架里面,基本都有实现了依赖注入的功能,可以让我们很方便地对应用的依赖进行管理,同时免去在各个地方 new 对象的麻烦。比
- 在使用Python编写面向对象的代码时,我们会常常使用“继承”这种开发方式。例如下面这一段代码:class Info: def
- 我就废话不多说了,直接上代码吧!import mathimport numpy as npimport matplotlib.pyplot
- 如何让图片自动缩放以适合界面大小,拿出你的Editplus,打开c_function.asp文件,找到UBBCode函数,在第417行有如下