如何将图像转换为另一个坐标?

时间:2017-02-27 17:44:17

标签: c# image image-processing emgucv image-scaling

我试图在我的数据库中找到重复的视频,为了做到这一点,我从视频对中抓取两个帧,将它们调整为相同的宽度和高度,然后逐个像素地比较两个图像。

我有一个案例,来自视频对的图片如下所示:

enter image description here ----- enter image description here

这些实际上是相同的视频(图像),但由于视频的宽高比(16:9,4:3等),在逐个像素(不匹配)比较时结果为负。

如果我的标准是50x50,我如何将 任何 感兴趣区域转换为50x50?

对于上面的例子:

  

像素[5,0]应为[0,0]

     

像素[45,0]应为[50,0]

     

像素[5,50]应为[0,50]

     

像素[45,50]应为[50,50]

     

所有其他像素已转换

1 个答案:

答案 0 :(得分:1)

鼓励OP伪代码可以提供帮助.... 我不知道" emgucv",所以我会用伪代码回答。

定义

SRC成为源图像 - 待阅读 让DST成为目标图像 - 写入。

SRCDST都是2D数组,可以ARRAY[int pixelX,int pixelY]进行访问。

以下是伪代码: -

input : int srcMinX,srcMinY,srcMaxX,srcMaxY;
float linearGra(float dst1,float dst2,float src1,float src2,float dst3){
    return ( (dst3-dst1)*src2+  (dst2-dst3)*src1) / (dst2-dst1);
};
for(int y=0;y<50;y++){     //y of DST
    for(int x=0;x<50;x++){ //x of DST
        float xSRC=linearGra(0,50,srcMinX,srcMaxX,x);
        float ySRC=linearGra(0,50,srcMinY,srcMaxY,y);
        DST[x,y]=SRC[round(xSRC),round(ySRC)];  //find nearest pixel
    }
}

描述

主要想法是使用linear-interpolation

函数linearGra在2D图(dst1,src1)(dst2,src2)中占两个点。

假设它是一个线性函数(因为scaling+movingSRCDST坐标之间的线性函数,这是真的),它会找到谎言的(dst3,?)点在图中。

我使用此函数计算SRC中与DST中某个像素匹配的像素坐标。

进一步的工作

如果你是一个完美主义者,你可能想: -

  • 限制了索引(xSRC,ySRC) - 所以它不会索引越界
  • 改善准确性: -
    我目前忽略了一些像素(我使用Nearest-neighbor w / o interpolation) 更好的方法是integrate all involved SRC's pixel,但在某些情况下你会得到一个模糊的图像。

您可能也对this opencv link (not emgucv)感兴趣。