图像翻转
图像翻转
图像翻转操作,就是将图像二维数组沿水平轴,垂直轴或者两个轴进行翻转操作。
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.rows−i−1,jsrci,src.cols−j−1srcsrc.rows−i−1,src.cols−j−1ifflipCode=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=mji,fori>j,iflowerToUpper=falsemij=mji,fori<j,iflowerToUpper=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