图像翻转
onlyloveyd 391 4

图像翻转

图像翻转

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

图像翻转 $$ \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. $$

图像转置

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

图像翻转 $$ \texttt{dst} (i,j) = \texttt{src} (j,i) $$

图像重复

图像复制操作,就是用输入图像的重复副本填充输出图像。

图像翻转 $$ \texttt{dst} _{ij}= \texttt{src} _{i\mod src.rows, ; j\mod src.cols } $$

图像对称

将方矩阵的下半部或上半部复制到另一半。

图像翻转 $$ \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 $$

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

评论区

索引目录