- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
您好,我使用包围曝光拍摄了不同的图像(相同的场景不同的曝光),我需要对齐图像并裁剪每一张,以便它们完全匹配。 (因为拍摄这些图像时有相机抖动)
我不想合并它们,我只想剪切、旋转或缩放..等每一个,以便它们完全对齐,然后保存它们。如果我知道如何做到这一点,我会添加一个代码示例。但我不知道。我是opencv的新手。
这是一个例子:
这是一个示例的真实示例:(此示例有很大的错位,大多数示例都需要进行小幅调整,因为与此不同的是晃动)
我需要的是裁剪每张图像以使它们相同(仅保留共享区域)
谢谢 !
最佳答案
在这个答案中,我描述了一种实现 的方法图像对齐 其中包括使用欧几里得模型根据图像2(中心图像)对图像1(左侧)和图像3(右侧)进行变换。
但是,我想快速指出,共享的图像非常具有挑战性:不仅对比度差异很大,而且它们在 上也有显着差异。翻译 , 规模 , 旋转 , 甚至可能是 的一点点剪切 .它们以非常低的分辨率发布的事实也无济于事。
无论如何,我指出了他们在 方面的差异。 2D 变换 因为在选择合适的模型来执行图像对齐时,您始终需要牢记这一点。 This nice picture is from a tutorial that describes the models in greater detail :
该方法包括以下步骤:
cv2.warpAffine()
的帮助下对图像 1 进行变换。并计算图像1中变换的近似矩形区域; cv2.warpAffine()
的帮助下对图像 3 进行变换。并计算变换的近似矩形面积。 ###
# reference:
# https://www.learnopencv.com/image-alignment-ecc-in-opencv-c-python/
###
import numpy as np
import cv2
# internalRect: returns the intersection between two rectangles
#
# p1 ---------------- p2
# | |
# | |
# | |
# p4 ---------------- p3
def internalRect(r1, r2):
x = 0
y = 1
w = 2
h = 3
rect1_pt1 = [ r1[x], r1[y] ]
rect1_pt2 = [ r1[x]+r1[w], r1[y] ]
rect1_pt3 = [ r1[x]+r1[w], r1[y]+r1[h] ]
rect1_pt4 = [ r1[x], r1[y]+r1[h] ]
rect2_pt1 = [ r2[x], r2[y] ]
rect2_pt2 = [ r2[x]+r2[w], r2[y] ]
rect2_pt3 = [ r2[x]+r2[w], r2[y]+r2[h] ]
rect2_pt4 = [ r2[x], r2[y]+r2[h] ]
int_pt1 = [ max(rect1_pt1[x], rect2_pt1[x]), max(rect1_pt1[y], rect2_pt1[y]) ]
int_pt2 = [ min(rect1_pt2[x], rect2_pt2[x]), max(rect1_pt2[y], rect2_pt2[y]) ]
int_pt3 = [ min(rect1_pt3[x], rect2_pt3[x]), min(rect1_pt3[y], rect2_pt3[y]) ]
int_pt4 = [ max(rect1_pt4[x], rect2_pt4[x]), min(rect1_pt4[y], rect2_pt4[y]) ]
rect = [ int_pt1[x], int_pt1[y], int_pt2[x]-int_pt1[x], int_pt4[y]-int_pt1[y] ]
return rect
# align_image: use src1 as the reference image to transform src2
def align_image(src1, src2, warp_mode=cv2.MOTION_TRANSLATION):
# convert images to grayscale
img1_gray = cv2.cvtColor(src1, cv2.COLOR_BGR2GRAY)
img2_gray = cv2.cvtColor(src2, cv2.COLOR_BGR2GRAY)
# define 2x3 or 3x3 matrices and initialize it to a identity matrix
if warp_mode == cv2.MOTION_HOMOGRAPHY:
warp_matrix = np.eye(3, 3, dtype=np.float32)
else:
warp_matrix = np.eye(2, 3, dtype=np.float32)
# number of iterations:
num_iters = 1000
# specify the threshold of the increment in the correlation coefficient between two iterations
termination_eps = 1e-8
# Define termination criteria
criteria = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, num_iters, termination_eps)
print('findTransformECC() may take a while...')
# perform ECC: use the selected model to calculate the transformation required to align src2 with src1. The resulting transformation matrix is stored in warp_matrix:
(cc, warp_matrix) = cv2.findTransformECC(img1_gray, img2_gray, warp_matrix, warp_mode, criteria, inputMask=None, gaussFiltSize=1)
if (warp_mode == cv2.MOTION_HOMOGRAPHY):
img2_aligned = cv2.warpPerspective(src2, warp_matrix, (src1.shape[1], src1.shape[0]), flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP)
else :
# use warpAffine() for: translation, euclidean and affine models
img2_aligned = cv2.warpAffine(src2, warp_matrix, (src1.shape[1], src1.shape[0]), flags=cv2.INTER_LINEAR + cv2.WARP_INVERSE_MAP, borderMode=cv2.BORDER_CONSTANT, borderValue=0)
#print('warp_matrix shape', warp_matrix.shape, 'data=\n', warp_matrix)
#print(warp_matrix, warp_matrix)
# compute the cropping area to remove the black bars from the transformed image
x = 0
y = 0
w = src1.shape[1]
h = src1.shape[0]
if (warp_matrix[0][2] < 0):
x = warp_matrix[0][2] * -1
w -= x
if (warp_matrix[1][2] < 0):
y = warp_matrix[1][2] * -1
h -= y
if (warp_matrix[1][2] > 0):
h -= warp_matrix[1][2]
matchArea = [ int(x), int(y), int(w), int(h) ]
#print('src1 w=', src1.shape[1], 'h=', src1.shape[0])
#print('matchedRect=', matchArea[0], ',', matchArea[1], '@', matchArea[2], 'x', matchArea[3], '\n')
return img2_aligned, matchArea
##########################################################################################
img1 = cv2.imread("img1.png")
img2 = cv2.imread("img2.png")
img3 = cv2.imread("img3.png")
# TODO: adjust contrast on all input images
###
# resize images to be the same size as the smallest image for debug purposes
###
max_h = img1.shape[0]
max_h = max(max_h, img2.shape[0])
max_h = max(max_h, img3.shape[0])
max_w = img1.shape[1]
max_w = max(max_w, img2.shape[1])
max_w = max(max_w, img3.shape[1])
img1_padded = cv2.resize(img1, (max_w, max_h), interpolation=cv2.INTER_AREA)
img2_padded = cv2.resize(img2, (max_w, max_h), interpolation=cv2.INTER_AREA)
img3_padded = cv2.resize(img3, (max_w, max_h), interpolation=cv2.INTER_AREA)
# stack them horizontally for display
hStack = np.hstack((img1_padded, img2_padded)) # stack images side-by-side
input_stacked = np.hstack((hStack, img3_padded)) # stack images side-by-side
cv2.imwrite("input_stacked.jpg", input_stacked)
cv2.imshow("input_stacked", input_stacked)
cv2.waitKey(0)
###
# perform image alignment
###
# specify the motion model
warp_mode = cv2.MOTION_EUCLIDEAN # cv2.MOTION_TRANSLATION, cv2.MOTION_EUCLIDEAN, cv2.MOTION_AFFINE, cv2.MOTION_HOMOGRAPHY
# for testing purposes: img2 will be the reference image
img1_aligned, matchArea1 = align_image(img2, img1, warp_mode)
img1_aligned_cpy = img1_aligned.copy()
cv2.rectangle(img1_aligned_cpy, (matchArea1[0], matchArea1[1]), (matchArea1[0]+matchArea1[2], matchArea1[1]+matchArea1[3]), (0, 255, 0), 2)
cv2.imwrite("img1_aligned.jpg", img1_aligned_cpy)
print('\n###############################################\n')
# for testing purposes: img2 will be the reference image again
img3_aligned, matchArea3 = align_image(img2, img3, warp_mode)
img3_aligned_cpy = img3_aligned.copy()
cv2.rectangle(img3_aligned_cpy, (matchArea3[0], matchArea3[1]), (matchArea3[0]+matchArea3[2], matchArea3[1]+matchArea3[3]), (0, 255, 0), 2)
cv2.imwrite("img3_aligned.jpg", img3_aligned_cpy)
# compute the crop area in the reference image and draw a red rectangle
cropRect = internalRect(matchArea1, matchArea3)
print('cropRect=', cropRect[0], ',', cropRect[1], '@', cropRect[2], 'x', cropRect[3], '\n')
img2_eq_cpy = img2.copy()
cv2.rectangle(img2_eq_cpy, (cropRect[0], cropRect[1]), (cropRect[0]+cropRect[2], cropRect[1]+cropRect[3]), (0, 0, 255), 2)
cv2.imwrite("img2_eq.jpg", img2_eq_cpy)
# stack results horizontally for display
res_hStack = np.hstack((img1_aligned_cpy, img2_eq_cpy)) # stack images side-by-side
aligned_stacked = np.hstack((res_hStack, img3_aligned_cpy)) # stack images side-by-side
cv2.imwrite("aligned_stacked.jpg", aligned_stacked)
cv2.imshow("aligned_stacked", aligned_stacked)
cv2.waitKey(0)
print('\n###############################################\n')
# crop images to the smallest internal area between them
img1_aligned_cropped = img1_aligned[cropRect[1] : cropRect[1]+cropRect[3], cropRect[0] : cropRect[0]+cropRect[2]]
img3_aligned_cropped = img3_aligned[cropRect[1] : cropRect[1]+cropRect[3], cropRect[0] : cropRect[0]+cropRect[2]]
img2_eq_cropped = img2[cropRect[1] : cropRect[1]+cropRect[3], cropRect[0] : cropRect[0]+cropRect[2]]
cropped_hStack = np.hstack((img1_aligned_cropped, img2_eq_cropped)) # stack images side-by-side
cropped_stacked = np.hstack((cropped_hStack, img3_aligned_cropped)) # stack images side-by-side
cv2.imwrite("cropped_stacked.jpg", cropped_stacked)
cv2.imshow("cropped_stacked", cropped_stacked)
cv2.waitKey(0)
关于python - 对齐和裁剪相同的场景图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62495112/
我正在尝试学习 Knockout 并尝试创建一个照片 uploader 。我已成功将一些图像存储在数组中。现在我想回帖。在我的 knockout 码(Javascript)中,我这样做: 我在 Jav
我正在使用 php 编写脚本。我的典型问题是如何在 mysql 中添加一个有很多替代文本和图像的问题。想象一下有机化学中具有苯结构的描述。 最有效的方法是什么?据我所知,如果我有一个图像,我可以在数据
我在两个图像之间有一个按钮,我想将按钮居中到图像高度。有人可以帮帮我吗? Entrar
下面的代码示例可以在这里查看 - http://dev.touch-akl.com/celebtrations/ 我一直在尝试做的是在 Canvas 上绘制 2 个图像(发光,然后耀斑。这些图像的链接
请检查此https://jsfiddle.net/rhbwpn19/4/ 图像预览对于第一篇帖子工作正常,但对于其他帖子则不然。 我应该在这里改变什么? function readURL(input)
我对 Canvas 有疑问。我可以用单个图像绘制 Canvas ,但我不能用单独的图像绘制每个 Canvas 。- 如果数据只有一个图像,它工作正常,但数据有多个图像,它不工作你能帮帮我吗? va
我的问题很简单。如何获取 UIImage 的扩展类型?我只能将图像作为 UIImage 而不是它的名称。图像可以是静态的,也可以从手机图库甚至文件路径中获取。如果有人可以为此提供一点帮助,将不胜感激。
我有一个包含 67 个独立路径的 SVG 图像。 是否有任何库/教程可以为每个路径创建单独的光栅图像(例如 PNG),并可能根据路径 ID 命名它们? 最佳答案 谢谢大家。我最终使用了两个答案的组合。
我想将鼠标悬停在一张图片(音乐专辑)上,然后播放一张唱片,所以我希望它向右移动并旋转一点,当它悬停时我希望它恢复正常动画片。它已经可以向右移动,但我无法让它随之旋转。我喜欢让它尽可能简单,因为我不是编
Retina iOS 设备不显示@2X 图像,它显示 1X 图像。 我正在使用 Xcode 4.2.1 Build 4D502,该应用程序的目标是 iOS 5。 我创建了一个测试应用(主/细节)并添加
我正在尝试从头开始以 Angular 实现图像 slider ,并尝试复制 w3school基于图像 slider 。 下面我尝试用 Angular 实现,谁能指导我如何使用 Angular 实现?
我正在尝试获取图像的图像数据,其中 w= 图像宽度,h = 图像高度 for (int i = x; i imageData[pos]>0) //Taking data (here is the pr
我的网页最初通过在 javascript 中动态创建图像填充了大约 1000 个缩略图。由于权限问题,我迁移到 suPHP。现在不用标准 标签本身 我正在通过这个 php 脚本进行检索 $file
我正在尝试将 python opencv 图像转换为 QPixmap。 我按照指示显示Page Link我的代码附在下面 img = cv2.imread('test.png')[:,:,::1]/2
我试图在这个 Repository 中找出语义分割数据集的 NYU-v2 . 我很难理解图像标签是如何存储的。 例如,给定以下图像: 对应的标签图片为: 现在,如果我在 OpenCV 中打开标签图像,
import java.util.Random; class svg{ public static void main(String[] args){ String f="\"
我有一张 8x8 的图片。 (位图 - 可以更改) 我想做的是能够绘制一个形状,给定一个 Path 和 Paint 对象到我的 SurfaceView 上。 目前我所能做的就是用纯色填充形状。我怎样才
要在页面上显示图像,你需要使用源属性(src)。src 指 source 。源属性的值是图像的 URL 地址。 定义图像的语法是: 在浏览器无法载入图像时,替换文本属性告诉读者她们失去的信息。此
**MMEditing是基于PyTorch的图像&视频编辑开源工具箱,支持图像和视频超分辨率(super-resolution)、图像修复(inpainting)、图像抠图(matting)、
我正在尝试通过资源文件将图像插入到我的程序中,如下所示: green.png other files 当我尝试使用 QImage 或 QPixm
我是一名优秀的程序员,十分优秀!