【问题标题】:Kaleidoscope effect using Python and OpenCV使用 Python 和 OpenCV 的万花筒效果
【发布时间】:2021-02-22 02:36:15
【问题描述】:

有没有人知道一个通​​用的算法来完成这个,甚至是一些源代码?

理想情况下,它应该是可定制的,例如;边数/反射数,选择要为万花筒采样的图像部分等

效果示例:

【问题讨论】:

  • 我的脚本中有许多万花筒效果,ImageMagick 中的万花筒。不幸的是,我有几天没有时间将其中之一变成 Python/OpenCV。但一种简单的方法是拍摄一个正方形尺寸的图像并将其裁剪为 4 个象限,然后将这些象限旋转 90 个不同的方向,然后将这些象限连接在一起。见fmwconcepts.com/imagemagick/kaleidoscopic/index.php
  • 如果您提供两张图片而不是一张组合图像会更好。我们现在必须裁剪它们。

标签: python opencv image-processing kaleidoscope


【解决方案1】:

这是一个简单的万花筒效果。一个使用对角双色调掩码将图像与其转置合并。然后将其水平翻转并水平连接。然后垂直翻转并垂直连接。最后将大小调整 50% 回到输入大小。图片必须是方形的(或裁剪过的方形 -- 不包括在内)。

有两个参数允许变化。一种是反转掩码。另一种是将合并后的图像旋转90度的倍数。

输入:

import cv2
import numpy as np

# arguments
invert = "no"     # invert mask; yes or no
rotate = 0        # rotate composite; 0, 90, 180, 270

# read image (must be square)
img = cv2.imread('river_valley.png')
ht, wd = img.shape[:2]

# transpose the image
imgt = cv2.transpose(img)

# create diagonal bi-tonal mask
mask = np.zeros((ht,wd), dtype=np.uint8)
points = np.array( [[ [0,0], [wd,0], [wd,ht] ]] )
cv2.fillPoly(mask, points, 255)
if invert == "yes":
    mask = cv2.bitwise_not(mask)

# composite img and imgt using mask
compA = cv2.bitwise_and(imgt, imgt, mask=mask)
compB = cv2.bitwise_and(img, img, mask=255-mask)
comp = cv2.add(compA, compB)

# rotate composite
if rotate == 90:
    comp = cv2.rotate(comp,cv2.ROTATE_90_CLOCKWISE)
elif rotate == 180:
    comp = cv2.rotate(comp,cv2.ROTATE_180)
elif rotate == 270:
    comp = cv2.rotate(comp,cv2.ROTATE_90_COUNTERCLOCKWISE)

# mirror (flip) horizontally
mirror = cv2.flip(comp, 1)

# concatenate horizontally
top = np.hstack((comp, mirror))

# mirror (flip) vertically
bottom = cv2.flip(top, 0)

# concatenate vertically
kaleidoscope_big = np.vstack((top, bottom))

# resize
kaleidoscope = cv2.resize(kaleidoscope_big, (0,0), fx=0.5, fy=0.5, interpolation=cv2.INTER_LINEAR)

# save results
cv2.imwrite('river_valley_kaleidoscope_mask.png', mask)
cv2.imwrite('river_valley_kaleidoscope.png', kaleidoscope)


cv2.imshow('image', img)
cv2.imshow('transpose', imgt)
cv2.imshow('mask', mask)
cv2.imshow('compA', compA)
cv2.imshow('compB', compB)
cv2.imshow('comp', comp)
cv2.imshow('kaleidoscope', kaleidoscope)
cv2.waitKey(0)
cv2.destroyAllWindows()

面具:

万花筒结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-21
    相关资源
    最近更新 更多