Android OpenCV(五十):图像翻转

735 阅读2分钟

这是我参与更文挑战的第 21 天,活动详情查看: 更文挑战

图像翻转

图像翻转

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

dstij={srcsrc.rowsi1,jif  flipCode=0srci,src.colsj1if  flipCode>0srcsrc.rowsi1,src.colsj1if  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.

图像转置

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

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

图像重复

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

dstij=srcimodsrc.rows,  jmodsrc.cols\texttt{dst} _{ij}= \texttt{src} _{i\mod src.rows, \; j\mod src.cols }

图像对称

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

mij=mjifori>jiflowerToUpper=falsemij=mjifori<jiflowerToUpper=true\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()
    }
}

效果

转置、赋值和对称

图像翻转

源码

github.com/onlyloveyd/…