我正在开发一个应用程序来检测病变区域,为此我使用抓取来检测 ROI 并从图像中删除背景。但是,在某些图像中,它运行不佳。他最终没有很好地确定感兴趣区域的边界。分水岭可以更好地识别此类工作的边缘,但是我在从抓地到分水岭的过渡过程中遇到了困难。在处理抓取之前,用户使用 touchevent 在感兴趣的图像(伤口区域)周围标记一个矩形,以方便算法的工作。如下图。

但是,使用其他伤口图像,分割效果不佳,显示出 ROI 检测的缺陷。
在应用程序中使用抓取的图像
在桌面中使用分水岭的图像

这是代码:
private fun extractForegroundFromBackground(coordinates: Coordinates, currentPhotoPath: String): String {
// TODO: Provide complex object that has both path and extension
val width = bitmap?.getWidth()!!
val height = bitmap?.getHeight()!!
val rgba = Mat()
val gray_mat = Mat()
val threeChannel = Mat()
Utils.bitmapToMat(bitmap, gray_mat)
cvtColor(gray_mat, rgba, COLOR_RGBA2RGB)
cvtColor(rgba, threeChannel, COLOR_RGB2GRAY)
threshold(threeChannel, threeChannel, 100.0, 255.0, THRESH_OTSU)
val rect = Rect(coordinates.first, coordinates.second)
val fg = Mat(rect.size(), CvType.CV_8U)
erode(threeChannel, fg, Mat(), Point(-1.0, -1.0), 10)
val …Run Code Online (Sandbox Code Playgroud) 我想检测android中文档的4个角。Iam使用opencv库。
Iam使用以下方法-(1)对图像进行灰度处理(2)应用中值模糊(3)应用自适应阈值(4)Canny边缘检测(5)找到轮廓(6)找到最大轮廓(7)获取边缘和角落最大轮廓
我的代码是
srcImg = Utils.loadResource(this, R.drawable.test1, Highgui.CV_LOAD_IMAGE_COLOR);
Imgproc.cvtColor(srcImg, srcImg, Imgproc.COLOR_BGR2GRAY);
Imgproc.medianBlur(srcImg, srcImg, 9);
Imgproc.adaptiveThreshold(srcImg, srcImg, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 11, 2);
Imgproc.Canny(srcImg, srcImg, 50, 80);
Imgproc.findContours(srcImg,contours , hierarchy, Imgproc.RETR_TREE, Imgproc.CHAIN_APPROX_SIMPLE);
Run Code Online (Sandbox Code Playgroud)
在进行精巧边缘检测后,由于许多点的轮廓边界被打破,因此图像中检测到的最大轮廓不是文档的实际边界。在某些图像中,最大轮廓线显示了边界的某些部分,但在某些图像中,轮廓线指向文档的中心或完全在文档外部
(A)在这种情况下我该如何继续?
我采用的另一种方法是应用houghs线变换并计算以90度角相交的线的交点,但在这种情况下无法获得精确点。当我放88
(B)如何处理那么多积分
(C)还是我需要遵循完全不同的方法?
我想在图像中检测信用卡大小的卡片。该卡可以是任何卡,例如身份证、会员卡。目前,我正在考虑使用 Canny Edge、Hough Line 和 Hough Circle 来检测卡。但当我想结合霍夫线和霍夫圆的所有信息来定位卡片时,这个过程会很繁琐。有人建议使用threshold和findContour,但卡片的颜色可能与背景相似,这使得这种方法很难达到预期的结果。有没有任何内核和方法可以帮助我检测卡?