Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python中带PIL的图像浮雕——添加深度、方位角等_Python_Image Processing_Python Imaging Library - Fatal编程技术网

Python中带PIL的图像浮雕——添加深度、方位角等

Python中带PIL的图像浮雕——添加深度、方位角等,python,image-processing,python-imaging-library,Python,Image Processing,Python Imaging Library,我正在尝试使用浮雕图像 PIL提供了压印图像的基本方法(使用ImageFilter.emboss) 在图像编辑软件包(如GIMP)中,您可以在此浮雕图像中更改方位角、深度和仰角等参数 如何使用PIL实现这一点?至少我想调整浮雕图像的“深度” 更新:我尝试了Paul建议的方法(修改filterargs如比例、偏移量和矩阵),但我无法改变“深度”效果。所以我还在寻找答案 下面是使用PIL(左)和GIMP(右)的浮雕效果的比较。原始图片位于此处 如果您无法通过使用或组合操作(如旋转,然后应用浮雕过滤器

我正在尝试使用浮雕图像

PIL提供了压印图像的基本方法(使用
ImageFilter.emboss

在图像编辑软件包(如GIMP)中,您可以在此浮雕图像中更改方位角、深度和仰角等参数

如何使用PIL实现这一点?至少我想调整浮雕图像的“深度”

更新:我尝试了Paul建议的方法(修改
filterargs
比例、偏移量和矩阵),但我无法改变“深度”效果。所以我还在寻找答案

下面是使用PIL(左)和GIMP(右)的浮雕效果的比较。原始图片位于此处


如果您无法通过使用或组合操作(如旋转,然后应用浮雕过滤器,重新旋转),(或增强对比度,然后浮雕)来实现目标,则您可以求助于更改(或创建自己的)过滤器矩阵

在ImageFilter.py中,您可以找到以下类:

##
# Embossing filter.

class EMBOSS(BuiltinFilter):
    name = "Emboss"
    filterargs = (3, 3), 1, 128, (
        -1,  0,  0,
        0,  1,  0,
        0,  0,  0
        )
将-1放置在矩阵的另一个角将改变方位角,使其成为-2可能会产生您想要的效果

矩阵逐像素应用。矩阵中的每个元素对应于当前像素和周围像素;表示当前像素的中心值。新的变换后的当前像素将被创建为所有9个像素的组合,由矩阵中的值加权。例如,一个全为零且中心为1的矩阵不会改变图像

其他参数为
比例
偏移
。对于内置浮雕,值为1(比例)和128(偏移)。改变这些将改变结果的整体强度

从ImageFilter.py:

# @keyparam scale Scale factor.  If given, the result for each
#    pixel is divided by this value.  The default is the sum
#    of the kernel weights.
# @keyparam offset Offset.  If given, this value is added to the
#    result, after it has been divided by the scale factor.
由于我不熟悉GIMP的“depth”参数的效果,我不能说哪一个最有可能实现您想要的

也可以使矩阵具有不同的大小。将(3,3)替换为(5,5),然后创建25个元素的矩阵

要在不重新保存源代码的情况下临时更改筛选器,请执行以下操作:

ImageFilter.EMBOSS.filterargs=((3, 3), 1, 128, (-1, 0, 0, 0, 1, 0, 0, 0, 0))

编辑:(采取这种方法) 我希望这有帮助。我现在明白你为什么对PIL的结果感到失望了。Wolfram Mathworld是一个很好的向量代数复习资源

之前

之后


要增加浮雕过滤器的深度,请增加过滤器遮罩的半径。低深度:

h = [[1, 0, 0]
     [0, 0, 0]
     [0, 0, -1]]
与高深度相比:

h = [[1, 0, 0, 0, 0, 0, 0]
     [0, 0, 0, 0, 0, 0, 0]
     [0, 0, 0, 0, 0, 0, 0]
     [0, 0, 0, 0, 0, 0, 0]
     [0, 0, 0, 0, 0, 0, 0]
     [0, 0, 0, 0, 0, 0, 0]
     [0, 0, 0, 0, 0, 0, -1]]
要更改方位角,请将非零系数放置在不同的角度:

h = [[0, 0, 1]
     [0, 0, 0]
     [-1, 0, 0]]
我不太确定海拔高度。您可能需要更改非零系数值?我只知道它需要一个高通滤波器

在任何情况下,要使用Scipy解决方案计算和显示图像:

import scipy.misc, scipy.signal
im = scipy.misc.imread(filename)
im_out = scipy.signal.convolve2d(im, h, 'same')
scipy.misc.imshow(im_out)
希望这有帮助

编辑:好的,正如Paul在PIL中暗示的那样,您可以调整过滤器参数,甚至可以定义一个全新的内核。“比例”和“偏移”参数与您要查找的内容无关。过滤器的尺寸对于调整深度最为重要

经进一步调查,PIL不允许您将过滤器尺寸更改为5x5以上。看起来很奇怪。因此,你不会像你预期的那样在深度上发生戏剧性的变化


对于完全控制,您可能需要尝试我和Paul前面提到的Scipy解决方案。将过滤器大小更改为可笑的大小,如21x21,然后看看它是否会产生您想要的差异。

谢谢您的回答!是的,我试着在3 X 3矩阵中调整参数。但是我没有得到想要的效果。。。i、 我想“增加深度效果”。你能解释一下这些矩阵元素是什么吗。。我找不到解释。。。再次感谢!要更改“深度”,您可以尝试更改浮雕过滤器中的
比例
偏移
参数(我猜是减小偏移和增大比例)。请参阅对我的答案的补充。不幸的是,如果我改变比例和偏移参数,则深度没有任何区别。安装Gimp并阅读以下内容后,Gimp和PIL对浮雕的定义显然有所不同。也就是说,着色(Gimp)与入射向量上的梯度差成正比,而不仅仅与浮雕本身成正比。如果您愿意,可以使用NumPy精确复制此过程,但可能还有PIL解决方案。也许如果你上传示例图片(原稿和期望的结果),谢谢bpowah的跟进。这个评论非常有用!我会很快上传图片。谢谢你的回复。上传图片应该不是什么挑战。您是否以某种方式受到这些网站的限制?我不会为您编写复制GIMP功能的代码。但是过程是这样的:1)将图像转换为黑白。2)将其转换为numpy数组,并将其乘以
深度值。3) 计算梯度(只需应用
梯度
函数)4)定义入射矢量(从方位角、仰角)5)找出梯度和矢量之间的差异。6) 转换回imgyes,PIL不允许您指定超过5x5的过滤器大小。这篇文章很有用(正如您和bpowah所解释的,我认为numpy/scipy是一个很好的解决方案。)
import scipy.misc, scipy.signal
im = scipy.misc.imread(filename)
im_out = scipy.signal.convolve2d(im, h, 'same')
scipy.misc.imshow(im_out)