import org.opencv.core.*;
import org.opencv.highgui.HighGui;
import org.opencv.imgcodecs.Imgcodecs;
import org.opencv.imgproc.Imgproc;
class Morphology_3Run {
public void run(String[] args) {
if (args.length == 0){
System.out.println("Not enough parameters!");
System.out.println("Program Arguments: [image_path]");
System.exit(-1);
}
Mat src = Imgcodecs.imread(args[0]);
if( src.empty() ) {
System.out.println("Error opening image: " + args[0]);
System.exit(-1);
}
HighGui.imshow("src", src);
Mat gray = new Mat();
if (src.channels() == 3)
{
Imgproc.cvtColor(src, gray, Imgproc.COLOR_BGR2GRAY);
}
其他
{
gray = src;
}
showWaitDestroy("gray" , gray);
Mat bw = new Mat();
Core.bitwise_not(gray, gray);
Imgproc.adaptiveThreshold(gray, bw, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 15, -2);
showWaitDestroy("binary" , bw);
Mat horizontal = bw.clone();
Mat vertical = bw.clone();
int horizontal_size = horizontal.cols() / 30;
Mat horizontalStructure = Imgproc.getStructuringElement(Imgproc.MORPH_RECT,
new Size(horizontal_size,1));
Imgproc.erode(horizontal, horizontal, horizontalStructure);
Imgproc.dilate(horizontal, horizontal, horizontalStructure);
showWaitDestroy("horizontal" , horizontal);
int vertical_size = vertical.rows() / 30;
Mat verticalStructure = Imgproc.getStructuringElement(Imgproc.MORPH_RECT,
new Size( 1,vertical_size));
Imgproc.erode(vertical, vertical, verticalStructure);
Imgproc.dilate(vertical, vertical, verticalStructure);
showWaitDestroy("vertical", vertical);
Core.bitwise_not(vertical, vertical);
showWaitDestroy("vertical_bit" , vertical);
Mat edges = new Mat();
Imgproc.adaptiveThreshold(vertical, edges, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY, 3, -2);
showWaitDestroy("edges", edges);
Mat kernel = Mat.ones(2, 2, CvType.CV_8UC1);
Imgproc.dilate(edges, edges, kernel);
showWaitDestroy("dilate", edges);
Mat smooth = new Mat();
vertical.copyTo(smooth);
Imgproc.blur(smooth, smooth,
new Size(2, 2));
smooth.copyTo(vertical, edges);
showWaitDestroy("smooth - final", vertical);
System.exit(0);
}
private void showWaitDestroy(String winname, Mat img) {
HighGui.imshow(winname, img);
HighGui.moveWindow(winname, 500, 0);
HighGui.waitKey(0);
HighGui.destroyWindow(winname);
}
}
public class Morphology_3 {
public static void main(String[] args) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
new Morphology_3Run().run(args);
}
}
Size2i Size
定义 types.hpp:370