PIL ImageChops.screen в cv2

Как я могу увидеть один и тот же код из PIL в cv2

img3 = ImageChops.screen(im1, im2)

2 ответа

Вы можете реализовать это с помощью формулы, используемой ImageChops.screen:

out = MAX - ((MAX - изображение1) * (MAX - изображение2) / MAX) ( источник)

Код:

import cv2
import numpy as np

im1 = cv2.imread('im1.png').astype(np.uint16)
im2 = cv2.imread('im2.png').astype(np.uint16)

im3 = (255 - ((255 - im1) * (255 - im2) / 255)).astype(np.uint8)

cv2.imwrite('im3.png', im3)

Продвижение в uint16s необходимо из-за умножения двух uint18 значения, в конце я бросил его обратно в uint8s, потому что значения гарантированно будут < 256 снова.

Экран накладывает два перевернутых изображения друг на друга ( источник)

Вы можете сделать это тоже (без numpy):

import cv2

# read the input images, they can be color (RGB) images too
im1 = cv2.imread('im1.jpg')
im2 = cv2.imread('im2.jpg')

# images must be of same size, if not resize one of the images 
if im1.shape != im2.shape:
    im2 = cv2.resize(im2, im1.shape[:2][::-1], interpolation = cv2.INTER_AREA)

# invert and normalize first image
im1 = cv2.normalize(cv2.bitwise_not(im1), None, 0, 1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

# invert and normalize second image
im2 = cv2.normalize(cv2.bitwise_not(im2), None, 0, 1, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_32F)

# superimpose two images, re-normalize and invert
im = cv2.bitwise_not(cv2.normalize(cv2.multiply(im1, im2), None, 0, 255, cv2.NORM_MINMAX, dtype=cv2.CV_8U))

# write the output image
cv2.imwrite('im.jpg', im)
Другие вопросы по тегам