Android OpenCV(五十):图像翻转

图像翻转

图像翻转

图像翻转操作,就是将图像二维数组沿水平轴,垂直轴或者两个轴进行翻转操作。

dst i j = { src src.rows − i − 1 , j i f    flipCode = 0 src i , src.cols − j − 1 i f    flipCode > 0 src src.rows − i − 1 , src.cols − j − 1 i f    flipCode < 0 \texttt{dst} _{ij} = \left\{ \begin{array}{l l} \texttt{src} _{\texttt{src.rows}-i-1,j} & if\; \texttt{flipCode} = 0 \\ \texttt{src} _{i, \texttt{src.cols} -j-1} & if\; \texttt{flipCode} > 0 \\ \texttt{src} _{ \texttt{src.rows} -i-1, \texttt{src.cols} -j-1} & if\; \texttt{flipCode} < 0 \\ \end{array} \right. dstij=srcsrc.rowsi1,jsrci,src.colsj1srcsrc.rowsi1,src.colsj1ifflipCode=0ifflipCode>0ifflipCode<0

图像转置

图像转置操作,就是将图像矩阵执行转置操作。

dst ( i , j ) = src ( j , i ) \texttt{dst} (i,j) = \texttt{src} (j,i) dst(i,j)=src(j,i)

图像重复

图像复制操作,就是用输入图像的重复副本填充输出图像。
dst i j = src i m o d    s r c . r o w s ,    j m o d    s r c . c o l s \texttt{dst} _{ij}= \texttt{src} _{i\mod src.rows, \; j\mod src.cols } dstij=srcimodsrc.rows,jmodsrc.cols

图像对称

将方矩阵的下半部或上半部复制到另一半。
m i j = m j i , f o r i > j , i f l o w e r T o U p p e r = f a l s e m i j = m j i , f o r i < j , i f l o w e r T o U p p e r = t r u e \texttt{m}_{ij}=\texttt{m}_{ji}, for\quad i>j, if\quad lowerToUpper=false \\ \texttt{m}_{ij}=\texttt{m}_{ji}, for\quad i<j, if\quad lowerToUpper=true mij=mjifori>jiflowerToUpper=falsemij=mjifori<jiflowerToUpper=true

API

图像翻转

public static void flip(Mat src, Mat dst, int flipCode)
  • 参数一:src,输入图像。
  • 参数二:dst,输出图像,大小与类型与原图相同。
  • 参数三:flipCode,翻转标志位。0代表沿着X轴翻转,正数如1代表沿着Y轴翻转。负数如-1代表沿着X轴Y轴翻转。

图像转置

public static void transpose(Mat src, Mat dst)
  • 参数一:src,输入图像。
  • 参数二:dst,输出图像,大小与类型与原图相同。

图像重复

public static void repeat(Mat src, int ny, int nx, Mat dst)
  • 参数一:src,输入图像。
  • 参数二:ny,Y轴方向复制多少次。
  • 参数三:nx,X轴方向复制多少次。
  • 参数四:dst,输出图像,类型与原图相同。

图像对称

public static void completeSymm(Mat m, boolean lowerToUpper)
  • 参数一:src,输入图像方矩阵,同时也是输出图像。

  • 参数二:lowerToUpper,如果为true,则将下半部分复制到上半部分。否则,将上半部分复制到下半部分。

操作

/**
 * 图像翻转
 * author: yidong
 * 2020/12/20
 */
class FlipActivity : AppCompatActivity() {
    private val mList = mutableListOf<ImageTextObject>()
    private val mAdapter by lazy { ImageTextAdapter(this, mList) }
    private val mBinding: ActivityFlipBinding by lazy {
        ActivityFlipBinding.inflate(layoutInflater)
    }

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

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(mBinding.root)
        mBinding.container.adapter = mAdapter
        wrapCoroutine({ showLoading() }, { doFlip() }, { hideLoading() })
    }

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

    private fun doFlip() {
        val resultX = Mat()
        val resultY = Mat()
        val resultXY = Mat()
        val resultTranspose = Mat()
        val resultRepeat = Mat()
        Core.flip(rgb, resultX, 0)
        Core.flip(rgb, resultY, 1)
        Core.flip(rgb, resultXY, -1)
        Core.transpose(rgb, resultTranspose)
        Core.repeat(rgb, 2, 2, resultRepeat)

        val resultSymmetryLowerToUpper = rgb.clone()
        Core.completeSymm(resultSymmetryLowerToUpper, true)
        val resultSymmetryUpperToLower = rgb.clone()
        Core.completeSymm(resultSymmetryUpperToLower, false)
        mList.add(ImageTextObject(rgb, "原图"))
        mList.add(ImageTextObject(resultX, "X轴翻转"))
        mList.add(ImageTextObject(resultY, "Y轴翻转"))
        mList.add(ImageTextObject(resultXY, "XY轴翻转"))
        mList.add(ImageTextObject(resultTranspose, "转置"))
        mList.add(ImageTextObject(resultRepeat, "repeat"))
        mList.add(ImageTextObject(resultSymmetryLowerToUpper, "Symmetry(下到上)"))
        mList.add(ImageTextObject(resultSymmetryUpperToLower, "Symmetry(上到下)"))
    }

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

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

效果

转置、赋值和对称
图像翻转

源码

https://github.com/onlyloveyd/LearningAndroidOpenCV

onlyloveyd CSDN认证博客专家 Android Kotlin OpenCV
个人公众号【OpenCV or Android】,热爱Android、Kotlin、Flutter和OpenCV。毕业于华中科技大学计算机专业,曾就职于华为武汉研究所。目前在三线小城市生活,专注Android、OpenCV、Kotlin、Flutter等有趣的技术。
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 博客之星2020 设计师:CY__ 返回首页