gpt4 book ai didi

python - 如何在 Python 中将一张图像的亮度应用到另一张图像上

转载 作者:太空宇宙 更新时间:2023-11-03 14:11:28 25 4
gpt4 key购买 nike

我正在尝试使用具有 3 种颜色的图像和 Perlin noise 来制作纹理。灰度图像。

这是原图:

Original Image

这是灰度 Perlin 噪声图像:

Grayscale Perlin Image

我需要做的是将原始图像的亮度应用于灰度图像,这样Perlin噪声图像中最暗和最亮的亮度不再是100%黑色(0)和100%白色(1),而是取自原始图像。然后,将新的亮度映射从灰度 Perlin 噪声图像应用回原始图像。

这是我尝试过的:

from PIL import Image

alpha = 0.5
im = Image.open(filename1).convert("RGBA")
new_img = Image.open(filename2).convert("RGBA")
new_img = Image.blend(im, new_img, alpha)
new_img.save("foo.png","PNG")

这是我得到的输出:

resulting gradient, sort of

这是错误的,但想象一下深色、浅橙色和明亮的颜色与灰度图像具有相同的渐变,但没有 100% 黑色或 100% 白色。

我相信我需要:

  1. 将原始图像转换为 HSV (正确地,我尝试使用 colorsysmatplotlib 中的一些函数,它们给出了我的数字很奇怪。

  2. 从原始图像中获取最高和最低 V 值。

  3. 将灰度图像转换为 HSV

  4. 使用原始 HSV 图像中的 V 值对灰度 HSV 进行转换或标准化(我认为这就是它的名称) .

  5. 使用新的变换/标准化灰度 V 值重新映射所有原始 V 值。

最佳答案

🤕为什么不起作用?

您使用的方法不会按预期工作,因为您不是保留一个图像的颜色和饱和度信息并获取另一图像的亮度信息(全部或部分),而是只是在两个图像的所有 channel 中进行插值同时,基于常数alphaas stated on the docs :

PIL.Image.blend(im1, im2, alpha)

Creates a new image by interpolating between two input images, using a constant alpha: out = image1 * (1.0 - alpha) + image2 * alpha

[...]

alpha – The interpolation alpha factor. If alpha is 0.0, a copy of the first image is returned. If alpha is 1.0, a copy of the second image is returned. There are no restrictions on the alpha value. If necessary, the result is clipped to fit into the allowed output range.

<小时/>

🔨 基本工作示例

首先,让我们来看一个基本的示例。我将使用 cv2 而不是 PIL,只是因为我更熟悉它并且我已经将它安装在我的计算机上。

我还将使用 HSL(cv2 中的 HLS)而不是 HSV,因为我认为这会产生更接近您可能正在寻找的输出。

import cv2

filename1 = './f1.png'
filename2 = './f2.png'

# Load both images and convert them from BGR to HLS:

img1 = cv2.cvtColor(cv2.imread(filename1, cv2.IMREAD_COLOR), cv2.COLOR_BGR2HLS)
img2 = cv2.cvtColor(cv2.imread(filename2, cv2.IMREAD_COLOR), cv2.COLOR_BGR2HLS)

# Copy img1, the one with relevant color and saturation information:

texture = img1.copy()

# Replace its lightness information with the one from img2:

texture[:,:,1] = img2[:,:,1]

# Convert the image back from HLS to BGR and save it:

cv2.imwrite('./texture.png', cv2.cvtColor(texture, cv2.COLOR_HLS2BGR))

这是最终的输出:

enter image description here

<小时/>

🎛️调整亮度

好的,我们有一个简单的案例,但您可能不想将 img1 的亮度完全替换为 img2 的亮度,因此在这种情况下只需替换这一行:

texture[:,:,1] = img2[:,:,1]

有了这两个:

alpha = 0.25
texture[:,:,1] = alpha * img1[:,:,1] + (1.0 - alpha) * img2[:,:,1]

现在,您将保留 img125% 亮度和 img275% 亮度,并且您可以根据需要进行调整。

对于 alpha = 0.25,输出将如下所示:

enter image description here

<小时/>

🌈HSLHSV

虽然HSL and HSV look quite similar, there are a few differences ,主要是关于它们如何表示纯白色和浅色,这将使该脚本在使用其中一种或另一种时生成略有不同的图像:

HSL ColorSolid Cylinder HSV ColorSolid Cylinder

我们只需要更改一些内容即可使其与 HSV 兼容:

import cv2

filename1 = './f1.png'
filename2 = './f2.png'

# Load both images and convert them from BGR to HSV:

img1 = cv2.cvtColor(cv2.imread(filename1, cv2.IMREAD_COLOR), cv2.COLOR_BGR2HSV)
img2 = cv2.cvtColor(cv2.imread(filename2, cv2.IMREAD_COLOR), cv2.COLOR_BGR2HSV)

# Copy img1, the one with relevant color and saturation information:

texture = img1.copy()

# Merge img1 and img2's value channel:

alpha = 0.25
texture[:,:,2] = alpha * img1[:,:,2] + (1.0 - alpha) * img2[:,:,2]

# Convert the image back from HSV to BGR and save it:

cv2.imwrite('./texture.png', cv2.cvtColor(texture, cv2.COLOR_HSV2BGR))

这是使用 HSV 时第一个示例的样子:

enter image description here

这是第二个示例(alpha = 0.25):

enter image description here

您可以看到最明显的差异出现在最亮的区域。

关于python - 如何在 Python 中将一张图像的亮度应用到另一张图像上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48468148/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com