如何使用Python在OpenCV中合成两个图像?

0s7z1bwu  于 2023-06-28  发布在  Python
关注(0)|答案(3)|浏览(131)

我有一个图像保持不变,另一个图像是第一个,但有一个过滤器应用于它。我想创建的第三个图像应该是这两个图像的合成。
我知道在MATLAB中有一个名为imfuse()的函数,默认颜色通道为绿色-洋红色。我想在Python中做同样的事情,使用完全相同的颜色通道。我该怎么做?
以下是图像(第一张是原始图片,第二张是应用滤波器的第一张图片,第三张是MATLAB结果):

谢谢你的帮助!

osh3o9ms

osh3o9ms1#

默认情况下,imfuse只是以不同的色带覆盖这对图像(默认为Method=falsecolorColorChannels=green-magenta)。
下面是MATLAB中的一个例子来说明(在Python/OpenCV中编写这个应该很容易):

% a pair of grayscale images
A = imread('cameraman.tif');
B = imrotate(A,5,'bicubic','crop');    % image "A" rotated a bit

% use IMFUSE
C = imfuse(A,B);
imshow(C)

% use our version where: Red=B, Green=A, Blue=B
C = cat(3, B, A, B);
imshow(C)

两者都应该给予你同样的东西:

编辑:

以下是Python/OpenCV版本:

import numpy as np
import cv2

A = cv2.imread(r"C:\path\to\a.png", 0)
B = cv2.imread(r"C:\path\to\b.png", 0)

#C = cv2.merge((B,A,B))
C = np.dstack((B,A,B))
cv2.imshow("imfuse",C)
cv2.waitKey(0)

slsn1g29

slsn1g292#

对于SimpleITK,给定以下MR输入图像:

import SimpleITK as sitk
fixed_image = sitk.ReadImage("images/mr1.png", sitk.sitkFloat32)
moving_image = sitk.ReadImage("images/mr2.png", sitk.sitkFloat32)
out_image = sitk.GetArrayFromImage(sitk.Compose(fixed_image, moving_image, fixed_image))
plt.imshow(out_image / out_image.max()), plt.axis('off')

iklwldmw

iklwldmw3#

下面是如何在Python/OpenCV/Numpy中做到这一点。

  • 读取图像
  • 读取边缘图像为灰度
  • 作为结果制作图像的副本
  • 将边缘图像放入绿色通道
  • (第一个图像的红色和蓝色通道构成洋红色)
  • 保存结果

图片:

边缘:

import cv2
import numpy as np

# read the image
image = cv2.imread('image.png')

# read the edge image as grayscale
edges = cv2.imread('edges.png', cv2.IMREAD_GRAYSCALE)

# set the image to the red and blue channels and edges to the green channels
result = image.copy()
result[:,:,1] = edges

# save the results
cv2.imwrite('image_and_edges.png', result)

# show the results
cv2.imshow('result', result)
cv2.waitKey(0)

结果:

交替

使用

result = image.copy()
result[:,:,0] = edges
result[:,:,2] = edges

结果:

相关问题