python - 如何使用 opencv copyTo() 函数?

标签 python python-3.x opencv image-processing computer-vision

我已经通读了 documentation for copyTo()但我仍然对如何将此功能应用于以下代码感到困惑。 This anwer说明我们可以使用 copyTo 函数代替 255-x。在这种情况下将如何应用此功能?我将不胜感激代码片段。

#   Compute the gradient map of the image
def doLap(image):

    # YOU SHOULD TUNE THESE VALUES TO SUIT YOUR NEEDS
    kernel_size = 5         # Size of the laplacian window
    blur_size = 5           # How big of a kernal to use for the gaussian blur
                            # Generally, keeping these two values the same or very close works well
                            # Also, odd numbers, please...

    blurred = cv2.GaussianBlur(image, (blur_size,blur_size), 0)
    return cv2.Laplacian(blurred, cv2.CV_64F, ksize=kernel_size)

#
#   This routine finds the points of best focus in all images and produces a merged result...
#
def focus_stack(unimages):
    images = align_images(unimages)

    print "Computing the laplacian of the blurred images"
    laps = []
    for i in range(len(images)):
        print "Lap {}".format(i)
        laps.append(doLap(cv2.cvtColor(images[i],cv2.COLOR_BGR2GRAY)))

    laps = np.asarray(laps)
    print "Shape of array of laplacians = {}".format(laps.shape)

    output = np.zeros(shape=images[0].shape, dtype=images[0].dtype)

    abs_laps = np.absolute(laps)
    maxima = abs_laps.max(axis=0)
    bool_mask = abs_laps == maxima
    mask = bool_mask.astype(np.uint8)
    for i in range(0,len(images)):
        output = cv2.bitwise_not(images[i],output, mask=mask[i])

    return 255-output

最佳答案

对不起,我在那里误导了你。尽管它在 C++ 中运行良好,但我在 Python 中找不到绑定(bind)。但是,您可以使用 numpy.copyto功能。

这是一个小演示,显示两种方法(bitwise_notcopyto)产生相同的结果。

import cv2
import numpy as np

# Create two images
im1 = np.zeros((100, 100, 3), np.uint8)
im1[:] = (255, 0, 0)
im2 = np.zeros((100, 100, 3), np.uint8)
im2[:] = (0, 255, 0)

# Generate a random mask
ran = np.random.randint(0, 2, (100, 100), np.uint8)

# List of images and masks
images = [im1, im2]
mask = [ran, 1-ran]

not_output = np.zeros((100, 100, 3), np.uint8)
copy_output = np.zeros((100, 100, 3), np.uint8)

for i in range(0, len(images)):
    # Using the 'NOT' way
    not_output = cv2.bitwise_not(images[i], not_output, mask=mask[i])
    # Using the copyto way
    np.copyto(copy_output, images[i], where=mask[i][:, :, None].astype(bool))

cv2.imwrite('not.png', 255 - not_output)
cv2.imwrite('copy.png', copy_output)

enter image description here enter image description here

请注意,一个额外的维度被填充到掩码数组中,以便它可以被广播。

关于python - 如何使用 opencv copyTo() 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51448049/

相关文章:

c++ - 如何将 map 传递给py?

c++ - OpenCV HOGDescriptor 堆崩溃

python - 在绘制 3d 表面时摆脱伪影/网格线

Python Exchange ActiveSync 库

python - 如何更改所有子列表的特定索引处的元素?

python-3.x - Tkinter:如何使 tkinter 文本小部件更新?

python - 在 Python 3 中管理 namespace 的正确方法是什么?

python - 检测文本页面上的初始/草图

opencv - 在OpenCV中将形状聚合为新形状

python - if else 在带有 for 循环的列表理解中