Совместить два изображения python

Русские Блоги

Наложение изображения opencv на Python / слияние изображений / побитовая операция

1 Наложение изображения

Может передавать функцию OpenCV cv.add() Или просто добавьте два изображения с помощью операции numpy, res = img1 + img2. Два изображения должны иметь одинаковую глубину и тип, или второе изображение может быть скалярным значением.

  • Добавление OpenCV — это операция насыщения, то есть существует верхний предел, а добавление Numpy — это модульная операция.
  • При добавлении двух изображений функция OpenCV даст лучшие результаты, поэтому всегда лучше придерживаться функции OpenCV.
import cv2 import numpy as np x = np.uint8([250]) y = np.uint8([10]) print( cv2.add(x,y) ) # 250+10 = 260 => 255 print( x+y ) # 250+10 = 260 % 256 = 4 Вывод: [[255]] [4]

2 слияние изображений

Это также добавление изображения, но изображению присваиваются разные веса (от 0 до 1), что создает ощущение смешивания или прозрачности.
Код

import cv2 import numpy as np img1 = cv2.imread('img.jpg') img2 = cv2.imread('img2.jpg') img2 = cv2.resize (img2, (480,331)) # Унифицировать размер изображения dst = cv2.addWeighted(img1,0.5,img2,0.5,0) cv2.imshow('dst',dst) cv2.waitKey(0) cv2.destroyAllWindows()

clipboard.png

3 побитовая операция

Включая побитовые операции AND, OR, NOT и XOR.
Я хочу поместить логотип opencv поверх изображения, если вы наложите два изображения, он изменит цвет; если вы объедините два изображения, вы получите эффект прозрачности. Я хочу, чтобы он был непрозрачным, если он Это прямоугольная область. Я могу использовать ROI для работы, как описано ранее, но логотип opencv не является прямоугольником. Вы можете выполнять побитовые операции для выполнения связанных функций.

import cv2 import numpy as np img1 = cv2.imread('img.jpg') img2 = cv2.imread('img1.jpg') img2 = cv2.resize(img2,(100,100)) # I want to put logo on top-left corner, So I create a ROI rows,cols,channels = img2.shape roi = img1[0:rows, 0:cols ] # Now create a mask of logo and create its inverse mask also img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) ret, mask = cv2.threshold(img2gray, 200, 255, cv2.THRESH_BINARY) mask_inv = cv2.bitwise_not(mask) # Now black-out the area of logo in ROI img1_bg = cv2.bitwise_and(roi,roi,mask = mask) # Take only region of logo from logo image. img2_fg = cv2.bitwise_and(img2,img2,mask = mask_inv) # Put logo in ROI and modify the main image dst = cv2.add(img1_bg,img2_fg) img1[0:rows, 0:cols ] = dst cv2.imshow('res',img1) cv2.waitKey(0) cv2.destroyAllWindows()

Источник

Читайте также:  Css три колонки div

Русские Блоги

Изучите математику, увиденную в картинках, смешивание изображений
Окончательный результат будет следующим:

1. Добавьте изображения (измените цвет изображения)
Для наложения двух изображений мы можем использовать здесь cv2.add() Функция, но убедитесь, что высота, ширина и количество каналов двух изображений карточек одинаковы.
Стоит отметить, что numpy можно напрямую связать с +, но эффекты этих двух методов могут быть разными:

x = np.uint8([250]) y = np.uint8([10]) print(cv2.add(x, y)) # 250+10 = 260 => 255 print(x + y) # 250+10 = 260 % 256 = 4 

Если изображение, которое мы обрабатываем, является двоичным изображением, будет проще использовать numpy +

Бинаризация изображения: бинаризация изображения — это процесс установки значения серого для пикселей изображения на 0 или 255, то есть все изображение представляет собой очевидный черно-белый эффект.

cv2.add() :
cv2.add складывает два изображения вместе и использует 255 отсчетов для тех, которые больше 255

import cv2 import numpy as np img0 = cv2.imread('0.png')#самолет img1 = cv2.imread('1.png')#машина res = cv2.add(img0,img1) cv2.imshow('img',res) cv2.waitKey(0) 



2. Смешивание изображений (изменение прозрачности изображения)
использовать cv2.addWeighted() , Он тоже работа двух картин тоскует по дому, но вес прибавляется
d s t = α ∗ i m g 1 + β ∗ i m g 2 + γ dst = \alpha * img1 + \beta * img2 +\gamma d s t = α ∗ i m g 1 + β ∗ i m g 2 + γ
где γ \gamma γ Эквивалент скорректированному значению

res2 = cv2.addWeighted(img0,0.8,img1,0.2,0) # Установите вес маленького самолета на 0,8, а вес маленького автомобиля на 0,2, чтобы добавить cv2.imshow('img2',res2) cv2.waitKey(0) 

Как видите, небольшая плоскость более заметна (прозрачность изменена)

Трехпоразрядная операция
Побитовая операция, как следует из названия, является побитовой операцией AND, OR, NOT, XOR (и ,, or, not, xor).
Соответствующая функция: cv2.bitwise_and() , cv2.bitwise_not() , cv2.bitwise_or() , cv2.bitwise_xor()
Конкретная цель заключается в следующем:

ps: Перед этим объясните концепцию маски: используйте двоичное изображение, чтобы частично перекрыть другое изображение

img1 = cv2.imread('0.jpg') img2 = cv2.imread('0.png') # Поскольку изображение самолета слишком велико, увеличивайте и уменьшайте масштаб здесь img2 = cv2.resize(img2,None,fx = 0.3,fy = 0.3) # Поместите самолет в левый верхний угол, выберите эту область rows, cols = img2.shape[:2] roi = img1[:rows, :cols] # Создать маску img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY) # Создайте маску, перевернув изображение выше (потому что вы не хотите, чтобы фон влиял на оверлей) mask_inv = cv2.bitwise_not(mask)# Самолет реверсируется битом # Сохраняем фон, кроме самолета img1_bg = cv2.bitwise_and(roi, roi, mask=mask_inv)# На img1 возьмите плоскость и маску и установите значение 0 # Функция шаблона - выбрать пиксель в исходном изображении для копирования dst = cv2.add(img1_bg, img2) # Выполнить фьюжн img1[:rows, :cols] = dst # Ставим на исходное изображение после слияния cv2.imshow('result', img1) cv2.waitKey(0) 


О параметре маски:

Функция шаблона — выбрать, какой пиксель исходного изображения можно скопировать.
В позиции (x, y), если значение пикселя маски не равно 0, тогда dst (x, y) = src (x, y);
Если значение пикселя маски равно 0, то dst (x, y) = 0;

Читайте также:  Версия питон через cmd

Источник

Как накладывать изображения в python?

Здравствуйте, интересует вопрос про наложение изображений. Есть два одинаковых изображения 1 и 2 (разных форматов), на 2-м изображении что-то наложено. Как можно наложить изображение 2 на первое так, чтобы получить эффект того, что у нас есть просто одно целое изображение, т.е. чтобы все элементы второго изображения (естественно, кроме того, что наложено на второе изображение) находились соответственно этим же элементам первого изображения? Интересует работа в питоне с библиотекой opencv. Заранее спасибо

Простой 1 комментарий

kshnkvn

AgentSmith

Здесь обычная работа с RGB-компонентами каждого из изображений проходя по каждому пикселю (i,j).
Важно учесть размеры, чтобы они совпадали.
Для наложения надо ввести аналоги альфа-компоненты (A) для каждого изображения, чтобы их сумма была равна 1.
Тогда, если у нас есть изображения a, b и результат c, то для каждого пикселя и цветовой компоненты надо вычислять
Rc = Ra*Aa + Rb * Ab; то же самое для G и B:
Gc = Ga*Aa + Gb * Ab
Bc = Ba*Aa + Bb * Ab
где Aa + Ab = 1

Vindicar

Т.е. если переформулировать вопрос:
Есть два изображения (A и B) с одинаковым набором маркеров. Нужно трансформировать изображение B так, чтобы его маркеры совпали по положению с маркерами изображения A, а потом наложить результат на изображение A.
Я так понял?

Если да, то это делается примерно так.
1. Формируешь два массива координат — маркеры на изображениях A и B. Как — зависит от типа маркеров, но порядок должен быть одинаковым в обоих массивах. Форма (shape) массивов должна быть (N, 1, 2), где последний индекс отвечает за x или y координату, а N — число маркеров.
2. Вызываешь

homography, ptmask = cv2.findHomography(arrayB, arrayA, cv2.RANSAC)

homography будет матрицей проективного преобразования — как повернуть маркеры B, чтобы они легли на маркеры A. ptmask будет содержать сведения о том, какие пары точек удалось совместить.
3. Делаешь вызов cv2.warpPerspective(), чтобы повернуть изображение B согласно матрице homography. Параметр размера должен быть таким чтобы второе изображение точно уместилось вместе с первым. Например, можно заранее создать большое изображение по размеру.
4. Делаешь совмещение. Используешь cv2.PerspectiveTransform(), чтобы понять, где на итоговом изображении будут углы изображения B, делаешь cv2.fillPoly() чтобы создать бинарную маску для наложения. В маске белый пиксель будет означать «сюда поместить пиксель из повернутого B», а черный — «оставить пиксель как есть». Используешь эту маску, чтобы выполнить наложение.

Читайте также:  Data science алгоритмы python

Пример кода и исходных данных — не совсем то, что тебе нужно, но идею передаст, я надеюсь.

Источник

Оцените статью