stacked image
blended image
image pyramid (same image with different resolutions)
Laplacian pyramid (low resolution image + edge detection at different resolution)
#main.pyimport numpy as np
import cv2
mountain1 = cv2.imread('assets/mountain1.jpg')
mountain1 = cv2.resize(mountain1, (1200, 800))
#print(mountain1.shape)
mountain2 = cv2.imread('assets/mountain2.jpg')
mountain2 = cv2.resize(mountain2, (1200, 800))
#print(mountain2.shape)
mountain_stack = np.hstack((mountain1[:, :700], mountain2[:, 700:]))
#generate Gaussian pyramid for mountain1
mountain1_copy = mountain1.copy()
mountain1_pyramid = [mountain1_copy]
for i in range(6):
#decrease image resolution
mountain1_copy = cv2.pyrDown(mountain1_copy)
mountain1_pyramid.append(mountain1_copy)
#generate Gaussian pyramid for mountain2
mountain2_copy = mountain2.copy()
mountain2_pyramid = [mountain2_copy]
for i in range(6):
#decrease image resolution
mountain2_copy = cv2.pyrDown(mountain2_copy)
mountain2_pyramid.append(mountain2_copy)
#generate Laplacina Pyramid for mountain1
mountain1_copy = mountain1_pyramid[5]
lp_mountain1 = [mountain1_copy]
for i in range(5, 0, -1):
resolution_up = cv2.pyrUp(mountain1_pyramid[i])
shape = mountain1_pyramid[i-1].shape
resolution_up = cv2.resize(resolution_up, (shape[1], shape[0]))
laplacian = cv2.subtract(mountain1_pyramid[i-1], resolution_up)
lp_mountain1.append(laplacian)
#generate Laplacina Pyramid for mountain2
mountain2_copy = mountain2_pyramid[5]
lp_mountain2 = [mountain2_copy]
for i in range(5, 0, -1):
resolution_up = cv2.pyrUp(mountain2_pyramid[i])
shape = mountain2_pyramid[i - 1].shape
resolution_up = cv2.resize(resolution_up, (shape[1], shape[0]))
laplacian = cv2.subtract(mountain2_pyramid[i-1], resolution_up)
lp_mountain2.append(laplacian)
#stack laplacian images
lp_pyramid = []
for mount1_lap, mount2_lap in zip(lp_mountain1, lp_mountain2):
row, col, ch = mount1_lap.shape
#print(mount1_lap.shape)
lp_stack = np.hstack((mount1_lap[:, :int(col*7/12)], mount2_lap[:, int(col*7/12):]))
#print(lp_stack.shape)
lp_pyramid.append(lp_stack)
#reconstruct stacked image
#reconstruct[0] has a low resolution stacked image
#reconstruct[1] is generated by adding scaled up reconstruct[0] and corresponding laplacian edges
#reconstruct[2] is generated by adding scaled up reconstruct[1] and corresponding laplacian edges
reconstruct = lp_pyramid[0]
for i in range(1, 6):
reconstruct = cv2.pyrUp(reconstruct)
#print(reconstruct.shape)
#print(lp_pyramid[i].shape)
shape = lp_pyramid[i].shape
reconstruct = cv2.resize(reconstruct, (shape[1], shape[0]))
reconstruct = cv2.add(lp_pyramid[i], reconstruct)
cv2.imshow('mountain1', mountain1)
cv2.imshow('mountain2', mountain2)
cv2.imshow('mountain stack', mountain_stack)
"""
for i in range(6):
image_name = 'mountain2 pyramid' + str(i)
cv2.imshow(image_name, mountain2_pyramid[i])
for i in range(5, -1, -1):
image_name = 'mountain laplacian ' + str(i)
cv2.imshow(image_name, lp_mountain1[i])
"""
cv2.imshow('blended image', reconstruct)
cv2.waitKey(0)
cv2.destroyAllWindows()
reference:
No comments:
Post a Comment