본문 바로가기
프로그래밍/OpenCV.

[OpenCV] 05.. Canny Edge와 Sobel Edge(feat.JAVA)

by _Chavi 2020. 11. 2.

JAVA와 OpenCV를 이용하여 소벨 에지(Sobel Edge)와 캐니 에지(Canny Edge)를 검출해보겠습니다.

 

Sobel Edge & Canny Edge
public static void showCannyNSobelEdgeWithLenna() {
	try {
		String locLenna = "경로생략/LennaGray.png";
		Mat imageLenna = Imgcodecs.imread(locLenna);
		
		// GrayScale
		Imgproc.cvtColor(imageLenna, imageLenna, Imgproc.COLOR_RGB2GRAY);
		
		// Start Canny Edge
		Mat cannyLenna = new Mat();
		Imgproc.Canny(imageLenna, cannyLenna, 30, 30*2.5, 3);
		// End Canny Edge
		
		// Start Sobel Edge
		Mat sobelLenna = new Mat();
		Mat sobelLenna_x = new Mat(), sobelLenna_y = new Mat();
		Mat sobelLenna_x_abs = new Mat(), sobelLenna_y_abs = new Mat();
		
		// Sobel Edge - horizontal direction
		Imgproc.Sobel(imageLenna, sobelLenna_x, CvType.CV_16S, 1, 0, 3, 1, 0);
		// Sobel Edge - vertical direction
		Imgproc.Sobel(imageLenna, sobelLenna_y, CvType.CV_16S, 0, 1, 3, 1, 0);
		
		//Calculating absolute value of gradients in both the direction
		Core.convertScaleAbs(sobelLenna_x, sobelLenna_x_abs);
		Core.convertScaleAbs(sobelLenna_y, sobelLenna_y_abs);
		
	    //Calculating the resultant gradient
	    Core.addWeighted(sobelLenna_x_abs, 0.5, sobelLenna_y, 0.5, 1, sobelLenna, 8);
		// End Sobel Edge
		// Show
		HighGui.imshow("Lenna", imageLenna);
		HighGui.imshow("Lenna(Canny Edge)", cannyLenna);
		HighGui.imshow("Lenna(Sobel Edge)", sobelLenna);
		
		HighGui.waitKey();
		System.exit(0);
			
	} catch (Exception e) {
		e.printStackTrace();
	}
}

 

01
실행결과

 

Canny Edge - 보너스 GUI

마우스로 지정한 공간의 Canny Edge를 구하는 프로그램입니다.

public static void showCannyWithMouseEvent() {
	try {
		String locLenna = "경로생략/LennaGray.png";
		Mat imageLenna = Imgcodecs.imread(locLenna);
		
		// Start Canny Edge
		Mat cannyLenna = new Mat();
		Imgproc.Canny(imageLenna, cannyLenna, 30, 30*2.5, 3);
		// End Canny Edge

		// Show
		JFrame window = HighGui.createJFrame("Lenna(feat.MouseEvent)", 1);
		window.setBounds(100, 100, 518, 541);
		window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		window.getContentPane().setLayout(null);
		window.setVisible(true);
			
		// 선택된 영역
		JLabel selectedImgLabel = new JLabel();
		selectedImgLabel.setBounds(0, 0, 512, 512);
		window.getContentPane().add(selectedImgLabel);
			
		// 이미지
		Image img = HighGui.toBufferedImage(imageLenna);
		JLabel imgLabel = new JLabel(new ImageIcon(img));
		imgLabel.setBounds(0, 0, 512, 512);
		imgLabel.addMouseListener(new MouseListener() {
			int startX = 0, startY = 0;
			@Override
			public void mousePressed(MouseEvent e) {
				startX = e.getX();
				startY = e.getY();
			}
			
			@Override
			public void mouseReleased(MouseEvent e) {
				Rect box = new Rect();
				box.x = startX; box.y = startY;
				box.width = e.getX() - startX; box.height = e.getY() - startY;
				
				Imgproc.Canny(new Mat(imageLenna ,box), cannyLenna, 30, 30*2.5, 3);
				Image img = HighGui.toBufferedImage(cannyLenna);
				selectedImgLabel.setIcon(new ImageIcon(img));
				selectedImgLabel.setBounds(box.x, box.y, box.width, box.height);
				window.repaint();
			}
			
			@Override public void mouseExited(MouseEvent e) {/*Nothing...*/}
			@Override public void mouseEntered(MouseEvent e) {/*Nothing...*/}
			@Override public void mouseClicked(MouseEvent e) {/*Nothing...*/}
		});
		window.getContentPane().add(imgLabel);
		
	} catch (Exception e) {
		e.printStackTrace();
	}
}

 

0123
실행결과

 

 

댓글