opencv线性插值(上采样)
生活随笔
收集整理的這篇文章主要介紹了
opencv线性插值(上采样)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、調(diào)用opencv的API
pyrUp(src, dst, Size(src.cols * 2, src.rows * 2));?
pyrUp:API詳解
這里的up是指將圖像的尺寸變大,所以原始圖像位于圖像金字塔的頂層。
首先將當(dāng)前層圖像的寬高擴(kuò)大2倍,插入的行和列位于偶數(shù)行或偶數(shù)列,這些位置填充數(shù)值0;然后用和pyrDown一樣的kernel和當(dāng)前層的圖像卷積,填充到剛才插入的行列中。
接口形式:
cv2.pyrUp(src[, dst[, dstsize[, borderType]]]) ->dst
- 參數(shù)含義:
- src:源圖像;
- dst:目標(biāo)圖像;
- dstsize:縮放后目標(biāo)圖像的尺寸,必須滿足std::abs(dsize.width – ssize.width*2) == dsize.width % 2 && std::abs(dsize.height – ssize.height*2) == dsize.height % 2
- borderType:邊界填充類型;
2、源碼實(shí)現(xiàn)?
先對圖像進(jìn)行升采樣(將圖像尺寸行和列方向增大一倍),然后再進(jìn)行高斯平滑;
Mat UpSample(Mat src)
{Mat dst;if (src.channels() != 1)return src;dst.create(src.rows * 2, src.cols * 2, src.type());//cout << "-- " << dst.rows << " " << dst.cols << " --" << endl;int m = 0, n = 0;for (int i = 0; i < dst.rows-2; i += 2, m++){n = 0;for (int j = 0; j < dst.cols-2; j += 2, n++){//需要防止地址越界pixel_t sample = *(src.data + src.step[0] * m + src.step[1] * n);*(dst.data + dst.step[0] * i + dst.step[1] * j) = sample;pixel_t sample_x = (*(src.data + src.step[0] * m + src.step[1] * n) + *(src.data + src.step[0] * m + src.step[1] * (n+1)));*(dst.data + dst.step[0] * (i) + dst.step[1] * (j+1)) = sample_x/2;pixel_t sample_y = (*(src.data + src.step[0] * m + src.step[1] * n) + *(src.data + src.step[0] * (m+1)+ src.step[1] * (n)));*(dst.data + dst.step[0] * (i+1) + dst.step[1] * (j)) = sample_y/2;pixel_t sample_center = (*(src.data + src.step[0] * m + src.step[1] * n) +*(src.data + src.step[0] * (m + 1) + src.step[1] * (n)) +*(src.data + src.step[0] * (m + 1) + src.step[1] * (n + 1)) +*(src.data + src.step[0] * m + src.step[1] * (n + 1)));*(dst.data + dst.step[0] * (i + 1) + dst.step[1] * (j + 1)) = sample_center / 4;}}if (dst.rows < 3 || dst.cols < 3)return src;//最后兩行兩列for (int k = dst.rows-1; k >= 0; k--){*(dst.data + dst.step[0] * k + dst.step[1] * (dst.cols - 2)) = *(dst.data + dst.step[0] * k + dst.step[1] * (dst.cols - 3));*(dst.data + dst.step[0] * k + dst.step[1] * (dst.cols - 1)) = *(dst.data + dst.step[0] * k + dst.step[1] * (dst.cols - 3));}for (int k = dst.cols-1; k >= 0; k--){*(dst.data + dst.step[0] * (dst.rows - 2) + dst.step[1] * k) = *(dst.data + dst.step[0] * (dst.rows - 3) + dst.step[1] * k);*(dst.data + dst.step[0] * (dst.rows - 1) + dst.step[1] * k) = *(dst.data + dst.step[0] * (dst.rows - 3) + dst.step[1] * k);}dst = guassFilter(dst, 5, 1.05);return dst;
}
3、結(jié)果比較
(1)調(diào)用API
(2)源碼實(shí)現(xiàn)
?
總結(jié)
以上是生活随笔為你收集整理的opencv线性插值(上采样)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: opencv隔点采样(下采样)
- 下一篇: c++中static_cast用法与uc