天天看點

opencv圖像分割合成_圖像融合 - opencv的圖像分割與融合技術

圖像融合(去裂縫處理)

從下圖可以看出,兩圖的拼接并不自然,原因就在于拼接圖的交界處,兩圖因為光照色澤的原因使得兩圖交界處的過渡很糟糕,是以需要特定的處了解決這種不自然。這裡的處理思路是權重融合,在重疊部分由前一幅圖像慢慢過渡到第二幅圖像,即将圖像的重疊區域的像素值按一定的權值相加合成新的圖像。

opencv圖像分割合成_圖像融合 - opencv的圖像分割與融合技術

//優化兩圖的連接配接處,使得拼接自然

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);

}

}

驗證拼接效果

opencv圖像分割合成_圖像融合 - opencv的圖像分割與融合技術