Android OpenCV(五十一):圖像插值

2021-01-19 OpenCV or Android
圖像插值

何為插值?

插值是離散函數逼近的重要方法,利用它可通過函數在有限個點處的取值狀況,估算出函數在其他點處的近似值。

何為圖像插值?

從低解析度圖像生成高解析度圖像的過程(放大),用以恢復圖像中所丟失的信息。

API
public static void resize(Mat src, Mat dst, Size dsize, double fx, double fy, int interpolation) 

  public static final int
          INTER_NEAREST = 0, // 最近鄰插值法
          INTER_LINEAR = 1,  // 雙線性插值法
          INTER_CUBIC = 2,   // 雙三次插值法
          INTER_AREA = 3,    // 使用像素區域關係進行重採樣
          INTER_LANCZOS4 = 4, // 8x8像素鄰域的Lanczos插值

插值方法最近鄰插值(INTER_NEAREST)

最近鄰插值法, 找到與之距離最相近的鄰居(原來就存在的像素點, 黑點), 賦值與其相同。

最近鄰插值雙線性插值 (INTER_LINEAR)

雙線性插值,又稱為雙線性內插。在數學上,雙線性插值是有兩個變量的插值函數的線性插值擴展,其核心思想是在兩個方向分別進行一次線性插值。

雙線性插值計算過程雙三次插值(INTER_CUBIC)

雙三次插值是一種更加複雜的插值方式,它能創造出比雙線性插值更平滑的圖像邊緣。在這種方法中,函數 f 在點 (x, y) 的值可以通過矩形網格中最近的十六個採樣點的加權平均得到,在這裡需要使用兩個多項式插值三次函數,每個方向使用一個。

雙立方插值

如上,P點就是目標圖像B在(X,Y)處對應於源圖像A中的位置, 假設P的坐標為(i+u,j+v),其中i,j分別表示整數部分,u,v分別表示小數部分。找到距離p最近的16個像素的位置,在這裡用a(m,n)(m,n=0,1,2,3)來表示。雙立方插值的目的就是通過找到一種關係,或者說係數,可以把這16個像素對於P處像素值得影響因子找出來,從而根據這個影響因子來獲得目標圖像對應點的像素值,達到圖像縮放的目的。基於BiCubic基函數的雙三次插值法使用如下函數:

計算公式

通過16個最近的點到P點的距離,求取權重係數。然後通過行列權重與各點的像素值乘積求和,獲取目標圖像對應位置的像素值。

區域插值(INTER_AREA )

區域插值共分三種情況,圖像放大時類似於雙線性插值,圖像縮小(x軸、y軸同時縮小)又分兩種情況,此情況下可以避免波紋出現。因此對圖像進行縮小時,為了避免出現波紋現象,推薦採用區域插值方法。

Lanczos插值(INTER_LANCZOS4)

蘭索斯插值,由相鄰的8*8像素計算得出,公式類似於雙線性。操作方式和雙三次插值類似,計算距離,計算權重,計算行列乘積,求和。

Lanczos插值計算操作
/**
 * 圖像插值
 * author: yidong
 * 2020/12/27
 */
class ResizeActivity : AppCompatActivity() {

    private val mList = mutableListOf<ImageTextObject>()
    private val mAdapter by lazy { ImageTextAdapter(this, mList) }
    private val mBinding: ActivityResizeBinding by lazy {
        ActivityResizeBinding.inflate(layoutInflater)
    }
    private val mFlags = mapOf(
        Imgproc.INTER_NEAREST to "INTER_NEAREST",
        Imgproc.INTER_LINEAR to "INTER_LINEAR",
        Imgproc.INTER_CUBIC to "INTER_CUBIC",
        Imgproc.INTER_AREA to "INTER_AREA",
        Imgproc.INTER_LANCZOS4 to "INTER_LANCZOS4"
    )

    private val rgb: Mat by lazy {
        val bgr = getBgrFromResId(R.drawable.tiny_lena)
        bgr.toRgb()
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(mBinding.root)
        mBinding.container.adapter = mAdapter
        wrapCoroutine({ before() }, { doResize() }, { after() })
    }

    override fun onDestroy() {
        super.onDestroy()
        rgb.release()
    }

    private fun doResize() {
        val w = rgb.rows()
        val h = rgb.cols()

        for (i in mFlags) {
            val dst = Mat()
            Imgproc.resize(
                rgb,
                dst,
                Size((w * 100).toDouble(), (h * 100).toDouble()),
                0.0,
                0.0,
                i.key
            )
            mList.add(ImageTextObject(dst, mFlags.getOrElse(i.key) { "" }))
        }
    }

    private fun before() {
        mBinding.isLoading = true
    }

    private fun after() {
        mBinding.isLoading = false
        mAdapter.notifyDataSetChanged()
    }
}

效果INTER_NEARESTINTER_LINEARINTER_CUBICINTER_AREAINTER_LANSZOS4源碼

https://github.com/onlyloveyd/LearningAndroidOpenCV

推薦閱讀:

Android OpenCV(五十):圖像翻轉

Android OpenCV(四十九):圖像積分圖

Android OpenCV(四十八):Poisson圖像編輯

Android OpenCV(四十七):脫色

相關焦點

  • 基於opencv 的圖像處理入門教程
    前言雖然計算機視覺領域目前基本是以深度學習算法為主,但實際上很多時候對圖片的很多處理方法,並不需要採用深度學習的網絡模型,採用目前成熟的圖像處理庫即可實現,比如 OpenCV 和 PIL ,對圖片進行簡單的調整大小、裁剪、旋轉,或者是對圖片的模糊操作。
  • opencv-python圖像預處理-濾波
    為了消除外界環境對圖像採集的幹擾,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰以及提高圖像處理速度需要對圖像進行預處理操作,主要是對圖像進行濾波和增強操作。使用的方法可以分為空間域處理和頻率域處理兩類。空間域指圖像平面本身,這類圖像處理方法用各種模板直接與圖像進行卷積運算,實現對圖像的處理。
  • OpenCV-Python 直方圖-2:直方圖均衡|二十七
    目標在本節中,我們將學習直方圖均衡化的概念,並利用它來提高圖像的對比度。理論考慮這樣一個圖像,它的像素值僅局限於某個特定的值範圍。例如,較亮的圖像將把所有像素限制在高值上。但是一幅好的圖像會有來自圖像所有區域的像素。
  • opencv-python獲取圖像:面向對象與面向過程
    獲取圖像的方式有:1,讀取本地圖片,2,調用筆記本自帶攝像頭或usb攝像頭,3,調用網絡攝像頭。這裡需要注意以下,opencv讀取圖片默認通道為BGR的格式,當在其他UI用戶界面顯示圖像時注意轉換一下通道順序,例如BGR轉換成RGB:Image1=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)下面讀取一張圖片並顯示
  • 每個cver都應該知道的十大OpenCV函數
    該庫提供了處理和分析圖像內容的工具,包括識別數字照片中的對象(如人的臉和圖形、文本等)、跟蹤對象的運動、轉換圖像、應用機器學習方法以及識別各種圖像中的公共元素。好了,現在我們可以從我個人選擇的十大函數開始學習。(使用Python編寫函數)imread/imshow這個函數必須放在首位,因為要用一張圖片來開始你的項目,此函數是必不可少的。
  • OpenCV-Python 圖像的幾何變換|十四
    目標學習將不同的幾何變換應用到圖像上,如平移、旋轉、仿射變換等。縮放縮放只是調整圖像的大小。為此,OpenCV帶有一個函數cv.resize()。圖像的大小可以手動指定,也可以指定縮放比例。也可使用不同的插值方法。
  • 輕鬆理解圖像縮放算法!最鄰近插值&&雙線性內插值!
    %%%%%%% %%%%%%% %%%%%%% %%%%%%% %%%%%%% %%%%%%%圖像的縮放,對於大家來說一定是個非常熟悉的過程了:最簡單直接的,就是雙手按住觸屏手機,手指外滑/內滑,就可以實現了。對於設計方向的小夥伴,通過PS,繪圖,或者任何一中程式語言,都有非常方便的方法可以實現。那現在不妨想一想,這簡單效果背後,是怎樣的算法思想呢?
  • 不知道這 7 大 OpenCV 函數怎麼向計算機視覺專家進階?
    該庫提供了用於處理和分析圖像內容的工具,包括識別數碼照片中的對象(例如人臉和人物,文本等),跟蹤對象的運動,轉換圖像,應用機器學習方法以及識別各種圖像中的共同元素。解決了上述問題,就可以開始介紹我選出的十大函數了。
  • 乾貨|OpenCV看這篇就夠了,9段代碼詳解圖像變換基本操作
    OpenCV的安裝也比較簡單,在Python中,通過pip包管理工具就可以實現安裝:pip install opencv-python如果在anaconda環境中安裝OpenCV,則通過下面的方法進行安裝:conda install opencv安裝完畢OpenCV後,可以通過下述方法來查看是否安裝成功
  • OpenCV+深度學習預訓練模型,簡單搞定圖像識別 | 教程
    這篇文章就展示了如何用ImageNet上預訓練的深度學習模型來識別圖像。OpenCV 3.3中的深度學習自OpenCV 3.1版以來,dnn模塊一直是opencv_contrib庫的一部分,在3.3版中,它被提到了主倉庫中。用OpenCV 3.3,可以很好地利用深度學習預訓練模型,將它們作為分類器。
  • Python中如何利用Opencv打開視頻或圖像並用PyQt控制項顯示
    OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS作業系統上,使用起來十分方便,把它與PyQt結合起來,就可以順利的操作視頻、圖像了。具體安裝請自行百度,這裡介紹使用方法。
  • OpenCV 之 霍夫變換
    Hough 變換,對圖像中直線的殘缺部分、噪聲、以及其它的共存結構不敏感,因此,具有很強的魯棒性。
  • 【OpenCV入門之十二】看起來一樣的圖像竟然存在這麼大的差別!
    對輸入的兩張圖像計算得到直方圖H1與H2,歸一化到相同的尺度空間然後可以通過計算H1與H2的之間的距離得到兩個直方圖的相似程度進而比較圖像本身的相似程度。Opencv提供的比較方法有四種:#include <opencv2/opencv.hpp>#include <iostream>#include <math.h>using namespace std;using namespace cv;string convertToString(double
  • 世界上最好的語言PHP:OpenCV與計算機視覺已在我掌控之下
    php-opencv:https://github.com/hihozhou/php-opencv這是圖像加載的方法:$image = cvimread(「images/faces.jpg」);相比之下,在 python 下圖像加載是這樣的:
  • Android利用SurfaceView顯示Camera圖像爬坑記(四)
    1.圖像預覽的surfaceviewpackage com.example.camera.preview;import android.content.Context;import android.graphics.PixelFormat
  • OpenCV中的快速直線檢測
    本文範例運行環境FastLineDetectors運行必要條件FastLineDetectors屬於opencv-contrib中的模塊,需要安裝opencv-contrib-python。在python的opencv相關的安裝包中,opencv-python 包含主要模塊,opencv-contrib-python 包含主要模塊以及一些擴展模塊。但這兩個模塊並不兼容,如果已經安裝過opencv-python,需要先卸載,再安裝opencv-contrib-python。
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 使用Python調整圖像大小
    從現在開始,我們將討論沒有alpha通道的彩色圖像,以保持簡單。Alpha是像素的透明度。圖像也只能有一個值從0到255的通道。這就是灰度圖像,也就是黑白圖像。在這裡我們使用彩色圖像!scale) new_dim: tuple = (new_width, new_height) return cv2.resize(src=im, dsize=new_dim, interpolation=cv2.INTER_LINEAR)interpolation參數的選項是cv2包中提供的flags之一:INTER_NEAREST – 近鄰插值
  • 基於OpenCv 和 Python 的手指識別及追蹤
    翻譯 | 餘杭 Lamaric 校對 | 吳曉曼 審核 | 餘杭詳細代碼參考:https://github.com/amarlearning/opencv手指追蹤是許多計算機視覺應用的重要特徵。在該應用中,使用基於直方圖的方法將手與背景幀分離。
  • 「python opencv視覺零基礎」十四、直方圖反向投影
    前文提醒:博主正在參加博客之星評比,成功入選Top200,現在暫居第九歡迎各位點擊了解更多幫我投票,非常感謝~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python