圖像融合(去裂縫處理)
從下圖可以看出,兩圖的拼接并不自然,原因就在于拼接圖的交界處,兩圖因為光照色澤的原因使得兩圖交界處的過渡很糟糕,是以需要特定的處了解決這種不自然。這裡的處理思路是權重融合,在重疊部分由前一幅圖像慢慢過渡到第二幅圖像,即将圖像的重疊區域的像素值按一定的權值相加合成新的圖像。
//優化兩圖的連接配接處,使得拼接自然
void OptimizeSeam(Mat& img1, Mat& trans, Mat& dst)
{
int start = MIN(corners.left_top.x, corners.left_bottom.x);//開始位置,即重疊區域的左邊界
double processWidth = img1.cols - start;//重疊區域的寬度
int rows = dst.rows;
int cols = img1.cols; //注意,是列數*通道數
double alpha = 1;//img1中像素的權重
for (int i = 0; i 《 rows; i++)
{
uchar* p = img1.ptr《uchar》(i); //擷取第i行的首位址
uchar* t = trans.ptr《uchar》(i);
uchar* d = dst.ptr《uchar》(i);
for (int j = start; j 《 cols; j++)
{
//如果遇到圖像trans中無像素的黑點,則完全拷貝img1中的資料
if (t[j * 3] == 0 && t[j * 3 + 1] == 0 && t[j * 3 + 2] == 0)
{
alpha = 1;
}
else
{
//img1中像素的權重,與目前處理點距重疊區域左邊界的距離成正比,實驗證明,這種方法确實好
alpha = (processWidth - (j - start)) / processWidth;
}
d[j * 3] = p[j * 3] * alpha + t[j * 3] * (1 - alpha);
d[j * 3 + 1] = p[j * 3 + 1] * alpha + t[j * 3 + 1] * (1 - alpha);
d[j * 3 + 2] = p[j * 3 + 2] * alpha + t[j * 3 + 2] * (1 - alpha);
}
}
驗證拼接效果