У меня есть следующее изображение:
Я могу отобразить это изображение в оттенках серого с помощью следующего кода Java OpenCV:
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.
ОБНОВЛЕНО
Я пытаюсь перенести пример Python, предоставленный janu777, на 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
, а также я не использую параметр iterations для методов Imgproc.erode
и Imgproc.dilate
, потому что сигнатура метода в этом случае также требует дополнительного параметра Point anchor
, которого у меня сейчас нет.
Что я делаю не так ?
Imgproc.threshold()
,Imgproc.erode()
,Imgproc.dilate()
, возможно,Imgproc.morphologyEx()
, постарайтесь - person Jyr   schedule 05.02.2018