【发布时间】:2018-07-15 18:59:57
【问题描述】:
我有以下图片:
我可以使用以下 OpenCV Java 代码对该图像进行灰度化处理:
public static Mat grayscale(Mat mat) throws IOException {
Mat gray = new Mat(mat.size(), CvType.CV_8UC1);
if (mat.channels() == 3) {
Imgproc.cvtColor(mat, gray, Imgproc.COLOR_RGB2GRAY);
} else if (mat.channels() == 1) {
mat.copyTo(gray);
} else {
throw new IOException("Invalid image type:" + mat.type());
}
return gray;
}
现在我需要从这张图片中去除背景噪音(扫描伪影、线条),只留下扫描的卡片。我想我必须使用阈值,在那里侵蚀但无法使用 OpenCV 来做到这一点。
我正在玩它,但结果现在很糟糕,并且破坏了所有图像:
public static Mat clean(Mat srcImage) {
Core.normalize(srcImage, srcImage, 0, 255, Core.NORM_MINMAX);
Imgproc.threshold(srcImage, srcImage, 0, 255, Imgproc.THRESH_OTSU);
//Imgproc.erode(srcImage, srcImage, new Mat());
Imgproc.dilate(srcImage, srcImage, new Mat(), new Point(0, 0), 1);
return srcImage;
}
请说明如何使用 OpenCV Java 来实现。
更新
我正在尝试将 janu777 提供的 Python 示例移植到 Java。这是我当前的代码:
Mat image = Imgcodecs.imread("test.png");
Mat gray = new Mat();
Imgproc.cvtColor(image, gray, Imgproc.COLOR_BGR2GRAY);
Core.absdiff(gray, new Scalar(255), gray);
double thresh = Imgproc.threshold(gray, gray, 5, 255, Imgproc.THRESH_TOZERO);
Mat kernel1 = Imgproc.getStructuringElement(Imgproc.MORPH_ELLIPSE, new Size(11, 11));
Mat kernel2 = Mat.ones(3, 3, CvType.CV_8U);
Mat erosion = new Mat();
Imgproc.erode(gray, erosion, kernel2);
Mat dilation = new Mat();
Imgproc.dilate(erosion, dilation, kernel1);
现在我得到了答案中提供的另一个结果:
我找不到应该应用 thresh 参数的地方,而且我没有使用 Imgproc.erode 和 Imgproc.dilate 方法的迭代参数,因为在这种情况下,方法签名还需要额外的 @987654333 @ 参数,我现在没有。
我做错了什么?
【问题讨论】:
-
Imgproc.threshold(),Imgproc.erode(),Imgproc.dilate(),也许是Imgproc.morphologyEx(),表现出一些努力 -
所有扫描的卡片中间都有那条线吗?
-
@janu777 有些人可以有这条线,但不是全部
-
这是我的步骤结果:(1)the steps(2)the result
标签: java image opencv image-editing