【问题标题】:Compare multiple images based on pixel values根据像素值比较多个图像
【发布时间】:2019-10-02 05:58:22
【问题描述】:

您好,我正在尝试比较一组图像,我希望在这些图像中生成具有每个单独图像的最大像素的最终图像。假设我有 3 张图像(转换为 10x10 矩阵),其中我知道每个块的像素值> 现在我想逐块比较这些值并生成最终的单独图像,其中每个图像的块值最大。

为此,我更改了图像尺寸(250x250),使得每个块都是 25x25 的正方形

我什至尝试比较两张图片并从两张图片中获取最大像素并显示它们

image = cv2.resize(im,(250,250))
hs,ws,c= image.shape
print(hs, ws,c)
hs = round(h/10)
ws = round(w/10)
resized = cv2.resize(image, (ws,hs), interpolation = cv2.INTER_AREA)
cv2.imshow("Resized image", resized)
cv2.waitKey(0)
cv2.destroyAllWindows()

print(list(resized))
#comparing two images
data = np.maximum.reduce([resized,resized1])
from matplotlib import pyplot as plt
plt.imshow(data, interpolation='nearest')
plt.show()

所以这是两个图像,平铺图像是块#比较两个图像的结果。现在使用这两个图像,我想生成与原始照片类似的最终图像,而不是平铺版本,但最终照片应该具有来自两张原始照片的像素(每张照片的最大值)。我希望它能解决问题

【问题讨论】:

  • 对不起,我不听你的问题。请详细说明并显示图表或图像。
  • @fmw42 我有一组图像(比如 6 个),将其分成 10x10 块(每个图像)。我为所有人做了边缘检测。现在,我想从这六幅图像中生成最终图像,使最终图像的像素值是所有这些单独图像中的最大值。将每个图像视为一个层,最终图像必须具有来自最大 6 个图像块的像素。我说得有道理吗?
  • 使用 AREA 插值调整图像大小,以便调整图像大小,使较小图像中的每个像素代表较大图像中的 10x10 区域。对每个尺寸的图像执行此操作。然后在每个尺寸缩小的图像之间逐个像素地获得最大值。请参阅我在stackoverflow.com/questions/58178208/… 的帖子。对每个图像执行此操作。然后得到所有 6 个缩小图像的最大值。如果我理解错了,请尝试重新解释或提供图表
  • @fmw42 我已经更新了这个问题。希望它能提供一些清晰

标签: python opencv image-processing computer-vision


【解决方案1】:

为了更好的可视化目的,我跳过整个调整大小部分you got earlier,并坚持调整大小的(250 x 250) 图像。

我的方法如下:将所有调整大小的图像存储在某个尺寸为(width x height x numberOfChannels x numberOfImages) 的 NumPy 数组中,然后使用 NumPy 的maxaxis=3,这样你就得到了具有最大 BGR 值的最终图像(width x height x numberOfChannels) (或灰度,如果需要)所有图像。

下面是一些示例代码:

import cv2
import numpy as np

# Set up empty images array
width, height, nChannels, nImages = (250, 250, 3, 3)
images = np.zeros((width, height, nChannels, nImages), np.uint8)

# Read and resize exemplary input images
images[:, :, :, 0] = cv2.resize(cv2.imread('WeQow.png'), (width, height))
images[:, :, :, 1] = cv2.resize(cv2.imread('gIHOd.png'), (width, height))
images[:, :, :, 2] = cv2.resize(cv2.imread('lAdfO.jpg'), (width, height))

# Generate maximum image along last axis, i.e. the images.
# For each BGR value you get the maximum over all images.
image = images.max(axis=3)

# Show images
cv2.imshow('image0', images[:, :, :, 0])
cv2.imshow('image1', images[:, :, :, 1])
cv2.imshow('image2', images[:, :, :, 2])
cv2.imshow('image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

这是三个输入图像:

最终的输出图像如下所示:

希望有帮助!

【讨论】:

  • 很好解释:-)
  • @HansHirse 感谢您的努力。我使用原始图像进行了尝试,我希望它会产生更清晰的图像,因为它会从一个区域收集最大像素值,但结果并不像我预期的那样。有什么建议吗?
  • @RockyJohanson “更清晰的图像”是什么意思?例如,通过使用两个图像中的最大值,您的图像中的苍蝇不会得到任何“更清晰”。你到底想达到什么目标?也许使用最大值对于您的原始问题是错误的,而解决方案则完全不同!?您可以再次编辑您的问题,但请确保不要使已经给出的答案无效。如果主题/问题/问题差异太大,最好提出一个新问题。
  • @HansHirse 好的,我将发布一个新问题并完整描述问题。感谢您的努力。
【解决方案2】:

您可以尝试使用块大小为(no_of_images, channels, block_height, block_width)block_reduce 函数。

skimage.measure.block_reduce(np.asarray([image1, image2, image3,...]), (no_of_images, channels, 1, 1), np.max)

如果您的输入图像是 RGB 比例并且您想要图像中的每个通道最大值(也输出 RGB 图像)只需替换 channels value with 1 或者如果您想要图像中通道之间的最大值然后使用 3 as channels value 这将生成灰度图像。

【讨论】:

    猜你喜欢
    • 2011-01-09
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2011-12-28
    • 2019-04-16
    相关资源
    最近更新 更多