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()

Python 实现图像合成微缩效果

(5) 绘制二值掩码图像:

plt.figure(figsize=(10,10))
plt.imshow(mask), plt.axis('off'), plt.title('(Bell Whistles) Mask image', size=10)
plt.show()

Python 实现图像合成微缩效果

(6) 最后,绘制合成微缩效果输出图像如下:

plt.figure(figsize=(20,10))
plt.imshow(out), plt.axis('off'), plt.title('Fake Miniature image', size=10)
plt.show()

Python 实现图像合成微缩效果

从上图中可以看出,焦点中的建筑物似乎距离镜头更近了。

来源:https://blog.csdn.net/qq_30167691/article/details/128226148

标签:Python,图像,合成,微缩
0
投稿

猜你喜欢

  • Bootstrap table学习笔记(2) 前后端分页模糊查询

    2024-04-29 13:12:22
  • Python中的tuple元组详细介绍

    2023-03-02 03:54:47
  • 在Go程序中实现服务器重启的方法

    2024-04-26 17:34:54
  • 一个拖动层和Onmouse自动下拉效果

    2007-10-08 21:25:00
  • CSS网页布局开发时的常见问题小结

    2009-08-13 12:17:00
  • Selenium元素的常用操作方法分析

    2021-09-21 14:51:54
  • Python中Numpy和Matplotlib的基本使用指南

    2021-10-26 04:22:44
  • Python面向对象三大特征 封装、继承、多态

    2022-01-09 04:31:51
  • 对numpy中array和asarray的区别详解

    2022-06-26 04:40:12
  • elementui的el-popover修改样式不生效的解决

    2024-05-09 15:22:24
  • JavaScript实现涂鸦笔功能

    2024-04-10 11:01:01
  • 教你解决往mysql数据库中存入汉字报错的方法

    2024-01-15 02:32:06
  • Mysql下自动删除指定时间以前的记录的操作方法

    2024-01-18 06:33:15
  • python 计算方位角实例(根据两点的坐标计算)

    2023-08-01 09:30:54
  • JavaScript中String.prototype用法实例

    2024-04-22 22:18:12
  • python+tkinter编写电脑桌面放大镜程序实例代码

    2023-08-02 17:10:43
  • 以大热剧《觉醒年代》为例用Python绘制可视化仪表盘

    2022-03-23 15:27:07
  • keras 解决加载lstm+crf模型出错的问题

    2022-06-11 01:27:27
  • php广告加载类用法实例

    2023-11-14 14:56:53
  • Django中create和save方法的不同

    2021-06-16 14:24:02
  • asp之家 网络编程 m.aspxhome.com