基于安卓的分水岭图像分割中的java问题
我正在开发一个应用程序,使用分水岭算法分割伤口图像。为此,用户在图形的内部区域绘制一条线伤口(感兴趣的区域)和背景中的另一幅画。然后,我将这张图的坐标传递给分水岭来执行分割。我用python中的这个code来指导我完成这一步。但是,除了没有执行正确的分割之外,黑白图像的保存方向与原始图像不同。在最终图像中,分割后的图像不会出现,而是原始图像。我希望有人帮我纠正这些错误
代码:
override fun onActivityResult(requestCode: Int, resultCode: Int, resultData: Intent?) {
super.onActivityResult(requestCode, resultCode, resultData)
if (requestCode == PICK_IMAGE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) {
tryOpenUri(resultData.data!!, resultData)
val selectedImage = if (resultData.data != null) {
resultData.data
} else {
resultData.clipData?.getItemAt(0)?.uri
}
imageUpload = true
val filePathColumn = arrayOf(MediaStore.Images.Media.DATA)
val cursor = contentResolver.query(selectedImage!!, filePathColumn, null, null, null)!!
cursor.moveToFirst()
currentPhotoPath = cursor.moveToFirst()
.let { cursor.getString(cursor.getColumnIndex(filePathColumn[0])) }
.also { cursor.close() }
cursor.close()
} else if (requestCode == SAVE_IMAGE_INTENT && resultCode == Activity.RESULT_OK && resultData != null && resultData.data != null) {
val outputStream = contentResolver.openOutputStream(resultData.data!!)
saveToOutputStream(outputStream, defaultPath.getCompressionFormat(), false)
savedPathsHash = my_canvas.getDrawingHashCode()
imageUpload = true
}
}
private fun regionBackground() {
progressDialog = ProgressDialog(this, R.style.MyDialogTheme)
progressDialog.setTitle("Wait..")
progressDialog.setMessage("save the draw...")
progressDialog.show()
progressDialog.setCancelable(false)
//Load the image
srcOriginal = Imgcodecs.imread(currentPhotoPath)
//Create a blank image of zeros (same dimension as img)
//It should be grayscale (1 color channel)
markers = Mat.zeros(srcOriginal.rows(), srcOriginal.cols(), CvType.CV_32S)
//This step is manual. The goal is to find the points
//which create the result we want. I suggest using a
//tool to get the pixel coordinates.
//Dictate the background and set the markers to 1
for (value in 0..my_canvas.pointsToDrawY.size - 1) {
markers.put(
my_canvas.pointsToDrawX[value].toInt(),
my_canvas.pointsToDrawY[value].toInt(),
1.0
)
}
my_canvas.pointsToDrawXStepTwo.clear()
my_canvas.pointsToDrawYStepTwo.clear()
//Log.i("teste", my_canvas.pointsToDrawXStepTwo.toString()+"x"+my_canvas.pointsToDrawYStepTwo)
Handler().postDelayed({
progressDialog.dismiss()
}, 1000)
}
private fun regionOfInterest() {
//Log.i("teste", my_canvas.pointsToDrawXStepTwo.toString()+"x"+my_canvas.pointsToDrawYStepTwo)
progressDialog = ProgressDialog(this, R.style.MyDialogTheme)
progressDialog.setTitle("Wait..")
progressDialog.setMessage("save the draw...")
progressDialog.show()
progressDialog.setCancelable(false)
//Dictate the area of interest
//I used different values for each part of the car (for visibility)
for (value in 0..my_canvas.pointsToDrawYStepTwo.size - 1) {
markers.put(
my_canvas.pointsToDrawXStepTwo[value].toInt(),
my_canvas.pointsToDrawYStepTwo[value].toInt(),
255.0
)
}
Handler().postDelayed({
watershedSegmentation()
}, 1000)
}
private fun watershedSegmentation() {
//Now we have set the markers, we use the watershed
//algorithm to generate a marked image
watershed(srcOriginal, markers)
//Plot this one. If it does what we want, proceed;
//otherwise edit your markers and repeat
val mPath1 = Environment.getExternalStorageDirectory().toString() + "/watershed.png"
Imgcodecs.imwrite(mPath1,markers)
//Make the background black, and what we want to keep white
for (x in 0 until srcOriginal.rows()-1) {
for (y in 0 until srcOriginal.cols()-1) {
if(markers.get(x,y).get(0).equals(1.0)){
markers.put(
x,
y,
0.0
)
}
if((markers[x, y].get(0) == 255.0)){
markers.put(
x,
y,
255.0
)
}
}
}
//Use a kernel to dilate the image, to not lose any detail on the outline
//I used a kernel of 3x3 pixels
val marker_tempo = Mat()
val dilatation = Mat()
markers.convertTo(marker_tempo, CvType.CV_8U)
val kernel = Mat(1, 1, CvType.CV_8U)
//Plot again to check whether the dilation is according to our needs
//If not, repeat by using a smaller/bigger kernel, or more/less iterations
Imgproc.dilate(marker_tempo, dilatation, kernel)
val mPath2 = Environment.getExternalStorageDirectory().toString() + "/dilatation.png"
Imgcodecs.imwrite(mPath2,dilatation)
//Now apply the mask we created on the initial image
Core.bitwise_and(srcOriginal, srcOriginal, dilatation)
//Plot the final result
val mPath = Environment.getExternalStorageDirectory().toString() + "/final.png"
Imgcodecs.imwrite(mPath,dilatation)
Handler().postDelayed({
progressDialog.dismiss()
Toast.makeText(this, "Image segmented!", Toast.LENGTH_SHORT).show()
}, 1000)
}
原始图像
绘制区域
创建一个零的空白图像(与img原始图像的尺寸相同)为什么会旋转?如何改善这种细分
放大输出图像:
最终输出图像:
要正确定位此图像,还缺少什么
共 (0) 个答案