我正在制作一个以最佳方式将两个图像组合在一起的程序。假设我有两个包含构成这两个图像的“像素”结构的二维数组。
我已经编写了确定 where 的算法,将图像连接起来,相对于“x”和“y”两个图像中较大的一个,其中x是列和y是较大图像的2D数组的行。它们应该连接的点被封装在一个“匹配”结构中,如下所示:
typedef struct {
int overlap; // used in algorithm to determine where to combine
int x; // column of larger image
int y; // row of larger image
int overlapWidth; // width of the overlap between the two images
int overlapHeight; // height of the overlap between the two images
} match;
请注意,相对于较大的图像,匹配点可能为负(x,y或两者)。
重叠中包含的像素是平均的,两个图像之外的任何像素(但仍在新维度内)都是白色的。
示例
+---+---+ image1
| | |
+---+---+---+ image2
| | X | |
+---+---+---+
| | |
+---+---+
X
表示这两个图像的匹配点,因此其状态如下所示:
x = 1
y = 1
overlapWidth = 1
overlapHeight = 1
此案例的新图片为3x3。
假设我有“匹配”将两个图像连接在一起,计算得到的图像的新宽度和高度,以及根据这些新尺寸为结果图像分配的2D数组,I我想知道如何将适当的像素放入新图像中。下面是一些代表我正在尝试做的伪代码。
伪代码
FOREACH row in new_height
FOREACH col in new_width
IF larger_image AND smaller_image do not contain (row,col)
add white pixel
ELSE IF overlap contains (row,col)
add average of pixels
ELSE IF only larger_image contains (row,col)
add larger_image pixel
ELSE
add smaller_image pixel
我很难想出办法来做到这一点。我不一定在寻找代码,我只是在寻找关于如何做我正在谈论的事情的想法。任何想法都将不胜感激。
答案 0 :(得分:1)
您的伪代码看起来是正确的。您是否只是将其翻译成C?
首先,您的伪代码使用单词“add”,这意味着像素被放入一些新数组,但它没有指定此数组的来源。所以请允许我稍微扩展你的伪代码:
Create a new_image
FOREACH row in new_height
FOREACH col in new_width
IF larger_image AND smaller_image do not contain (row,col)
in new_image, set (row,col) to white pixel
ELSE IF overlap contains (row,col)
in new_image, set (row,col) to average of pixels
ELSE IF only larger_image contains (row,col)
in new_image, set (row,col) to larger_image pixel
ELSE
in new_image, set (row,col) to smaller_image pixel
现在的问题是“不包含(row,col)”。图像不包含特定坐标是什么意思?这意味着(row,col)坐标位于源图像中的空间之外。我认为如果你在新的图像空间中编写一个带有图像(大或小)和match
结构以及(行,col)坐标的函数,它会有所帮助,并返回相应的像素来自源图像,或表示该像素不在该图像中。 (在C中,你可以通过让函数返回一个int来实现这个,如果有一个像素则为1,如果没有则返回0,并且有一个参数是指向你填写的像素的指针,如果你要返回1。)
现在你可以问这个函数big_image和small_image是否包含(row,col),还可以从每个像素中获取像素(如果有),并应用你的四种不同情况。
答案 1 :(得分:1)
要检查(row,col)
所属的图像,您可以使用此算法。我需要有大小图像的大小;因此额外的参数。
INPUT: row, col, match, big, small
if match.x < 0 then
// offset of big image, in case small one is to the left
offsetx <- -match.x
if match.y < 0 then
// offset of big image, in case small one is above
offsety <- -match.y
if offsetx <= col and col < offsetx + big.width then
if offsety <= row and row < offsety + big.height then
hitBig <- true
coordBig <- (col - offsetx, row - offsety)
if offsetx + match.x <= col and col < offsetx + match.x + small.width then
if offsety + match.y <= row and row < offsety + match.y + small.height then
hitSmall <- true
coordSmall <- (col - offsetx - match.x, row - offsety - match.y)
return hitBig, coordBig, hitSmall, coordSmall
所有坐标都相对于新图像。如果小图像在上方和左侧,则它将在新图像中为(0,0),并且向下和向下按下大图像。