Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 410 B After Width: | Height: | Size: 923 B |
Before Width: | Height: | Size: 457 B After Width: | Height: | Size: 844 B |
Before Width: | Height: | Size: 1.5 KiB |
Before Width: | Height: | Size: 458 B After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 685 B After Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 558 B After Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 608 B After Width: | Height: | Size: 2.0 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 617 B After Width: | Height: | Size: 1.5 KiB |
@ -0,0 +1,155 @@ |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Container; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.image.BufferedImage; |
||||
import java.awt.image.DataBufferByte; |
||||
|
||||
import javax.swing.BoxLayout; |
||||
import javax.swing.ImageIcon; |
||||
import javax.swing.JComboBox; |
||||
import javax.swing.JFrame; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JSlider; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
|
||||
import org.opencv.core.Core; |
||||
import org.opencv.core.Mat; |
||||
import org.opencv.core.Point; |
||||
import org.opencv.core.Size; |
||||
import org.opencv.imgcodecs.Imgcodecs; |
||||
import org.opencv.imgproc.Imgproc; |
||||
|
||||
public class MorphologyDemo1 { |
||||
private static final String[] ELEMENT_TYPE = { "Rectangle", "Cross", "Ellipse" }; |
||||
private static final String[] MORPH_OP = { "Erosion", "Dilatation" }; |
||||
private static int maxKernelSize = 21; |
||||
private Mat matImgSrc; |
||||
private Mat matImgDst = new Mat(); |
||||
private int elementType = Imgproc.CV_SHAPE_RECT; |
||||
private int kernelSize = 0; |
||||
private boolean doErosion = true; |
||||
private JFrame frame; |
||||
private JLabel imgLabel; |
||||
|
||||
public MorphologyDemo1(String[] args) { |
||||
String imagePath = args.length > 0 ? args[0] : "../data/LinuxLogo.jpg"; |
||||
matImgSrc = Imgcodecs.imread(imagePath); |
||||
if (matImgSrc.empty()) { |
||||
System.out.println("Empty image: " + imagePath); |
||||
System.exit(0); |
||||
} |
||||
|
||||
// Create and set up the window.
|
||||
frame = new JFrame("Erosion and dilatation demo"); |
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
||||
// Set up the content pane.
|
||||
BufferedImage img = toBufferedImage(matImgSrc); |
||||
addComponentsToPane(frame.getContentPane(), img); |
||||
// Use the content pane's default BorderLayout. No need for
|
||||
// setLayout(new BorderLayout());
|
||||
// Display the window.
|
||||
frame.pack(); |
||||
frame.setVisible(true); |
||||
} |
||||
|
||||
private void addComponentsToPane(Container pane, BufferedImage img) { |
||||
if (!(pane.getLayout() instanceof BorderLayout)) { |
||||
pane.add(new JLabel("Container doesn't use BorderLayout!")); |
||||
return; |
||||
} |
||||
|
||||
JPanel sliderPanel = new JPanel(); |
||||
sliderPanel.setLayout(new BoxLayout(sliderPanel, BoxLayout.PAGE_AXIS)); |
||||
|
||||
JComboBox<String> elementTypeBox = new JComboBox<>(ELEMENT_TYPE); |
||||
elementTypeBox.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
@SuppressWarnings("unchecked") |
||||
JComboBox<String> cb = (JComboBox<String>)e.getSource(); |
||||
if (cb.getSelectedIndex() == 0) { |
||||
elementType = Imgproc.CV_SHAPE_RECT; |
||||
} else if (cb.getSelectedIndex() == 1) { |
||||
elementType = Imgproc.CV_SHAPE_CROSS; |
||||
} else if (cb.getSelectedIndex() == 2) { |
||||
elementType = Imgproc.CV_SHAPE_ELLIPSE; |
||||
} |
||||
update(); |
||||
} |
||||
}); |
||||
sliderPanel.add(elementTypeBox); |
||||
|
||||
sliderPanel.add(new JLabel("Kernel size: 2n + 1")); |
||||
JSlider slider = new JSlider(0, maxKernelSize, 0); |
||||
slider.addChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
JSlider source = (JSlider) e.getSource(); |
||||
kernelSize = source.getValue(); |
||||
update(); |
||||
} |
||||
}); |
||||
sliderPanel.add(slider); |
||||
|
||||
JComboBox<String> morphOpBox = new JComboBox<>(MORPH_OP); |
||||
morphOpBox.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
@SuppressWarnings("unchecked") |
||||
JComboBox<String> cb = (JComboBox<String>)e.getSource(); |
||||
doErosion = cb.getSelectedIndex() == 0; |
||||
update(); |
||||
} |
||||
}); |
||||
sliderPanel.add(morphOpBox); |
||||
|
||||
pane.add(sliderPanel, BorderLayout.PAGE_START); |
||||
imgLabel = new JLabel(new ImageIcon(img)); |
||||
pane.add(imgLabel, BorderLayout.CENTER); |
||||
} |
||||
|
||||
private BufferedImage toBufferedImage(Mat matrix) { |
||||
int type = BufferedImage.TYPE_BYTE_GRAY; |
||||
if (matrix.channels() > 1) { |
||||
type = BufferedImage.TYPE_3BYTE_BGR; |
||||
} |
||||
int bufferSize = matrix.channels() * matrix.cols() * matrix.rows(); |
||||
byte[] buffer = new byte[bufferSize]; |
||||
matrix.get(0, 0, buffer); // get all the pixels
|
||||
BufferedImage image = new BufferedImage(matrix.cols(), matrix.rows(), type); |
||||
final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); |
||||
System.arraycopy(buffer, 0, targetPixels, 0, buffer.length); |
||||
return image; |
||||
} |
||||
|
||||
private void update() { |
||||
Mat element = Imgproc.getStructuringElement(elementType, new Size(2 * kernelSize + 1, 2 * kernelSize + 1), |
||||
new Point(kernelSize, kernelSize)); |
||||
|
||||
if (doErosion) { |
||||
Imgproc.erode(matImgSrc, matImgDst, element); |
||||
} else { |
||||
Imgproc.dilate(matImgSrc, matImgDst, element); |
||||
} |
||||
BufferedImage img = toBufferedImage(matImgDst); |
||||
imgLabel.setIcon(new ImageIcon(img)); |
||||
frame.repaint(); |
||||
} |
||||
|
||||
public static void main(String[] args) { |
||||
// Load the native OpenCV library
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME); |
||||
|
||||
// Schedule a job for the event dispatch thread:
|
||||
// creating and showing this application's GUI.
|
||||
javax.swing.SwingUtilities.invokeLater(new Runnable() { |
||||
@Override |
||||
public void run() { |
||||
new MorphologyDemo1(args); |
||||
} |
||||
}); |
||||
} |
||||
} |
@ -0,0 +1,153 @@ |
||||
import java.awt.BorderLayout; |
||||
import java.awt.Container; |
||||
import java.awt.event.ActionEvent; |
||||
import java.awt.event.ActionListener; |
||||
import java.awt.image.BufferedImage; |
||||
import java.awt.image.DataBufferByte; |
||||
|
||||
import javax.swing.BoxLayout; |
||||
import javax.swing.ImageIcon; |
||||
import javax.swing.JComboBox; |
||||
import javax.swing.JFrame; |
||||
import javax.swing.JLabel; |
||||
import javax.swing.JPanel; |
||||
import javax.swing.JSlider; |
||||
import javax.swing.event.ChangeEvent; |
||||
import javax.swing.event.ChangeListener; |
||||
|
||||
import org.opencv.core.Core; |
||||
import org.opencv.core.Mat; |
||||
import org.opencv.core.Point; |
||||
import org.opencv.core.Size; |
||||
import org.opencv.imgcodecs.Imgcodecs; |
||||
import org.opencv.imgproc.Imgproc; |
||||
|
||||
public class MorphologyDemo2 { |
||||
private static final String[] MORPH_OP = { "Opening", "Closing", "Gradient", "Top Hat", "Black Hat" }; |
||||
private static final int[] MORPH_OP_TYPE = { Imgproc.MORPH_OPEN, Imgproc.MORPH_CLOSE, |
||||
Imgproc.MORPH_GRADIENT, Imgproc.MORPH_TOPHAT, Imgproc.MORPH_BLACKHAT }; |
||||
private static final String[] ELEMENT_TYPE = { "Rectangle", "Cross", "Ellipse" }; |
||||
private static int maxKernelSize = 21; |
||||
private Mat matImgSrc; |
||||
private Mat matImgDst = new Mat(); |
||||
private int morphOpType = Imgproc.MORPH_OPEN; |
||||
private int elementType = Imgproc.CV_SHAPE_RECT; |
||||
private int kernelSize = 0; |
||||
private JFrame frame; |
||||
private JLabel imgLabel; |
||||
|
||||
public MorphologyDemo2(String[] args) { |
||||
String imagePath = args.length > 0 ? args[0] : "../data/LinuxLogo.jpg"; |
||||
matImgSrc = Imgcodecs.imread(imagePath); |
||||
if (matImgSrc.empty()) { |
||||
System.out.println("Empty image: " + imagePath); |
||||
System.exit(0); |
||||
} |
||||
|
||||
// Create and set up the window.
|
||||
frame = new JFrame("Morphology Transformations demo"); |
||||
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); |
||||
// Set up the content pane.
|
||||
BufferedImage img = toBufferedImage(matImgSrc); |
||||
addComponentsToPane(frame.getContentPane(), img); |
||||
// Use the content pane's default BorderLayout. No need for
|
||||
// setLayout(new BorderLayout());
|
||||
// Display the window.
|
||||
frame.pack(); |
||||
frame.setVisible(true); |
||||
} |
||||
|
||||
private void addComponentsToPane(Container pane, BufferedImage img) { |
||||
if (!(pane.getLayout() instanceof BorderLayout)) { |
||||
pane.add(new JLabel("Container doesn't use BorderLayout!")); |
||||
return; |
||||
} |
||||
|
||||
JPanel sliderPanel = new JPanel(); |
||||
sliderPanel.setLayout(new BoxLayout(sliderPanel, BoxLayout.PAGE_AXIS)); |
||||
|
||||
JComboBox<String> morphOpBox = new JComboBox<>(MORPH_OP); |
||||
morphOpBox.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
@SuppressWarnings("unchecked") |
||||
JComboBox<String> cb = (JComboBox<String>)e.getSource(); |
||||
morphOpType = MORPH_OP_TYPE[cb.getSelectedIndex()]; |
||||
update(); |
||||
} |
||||
}); |
||||
sliderPanel.add(morphOpBox); |
||||
|
||||
JComboBox<String> elementTypeBox = new JComboBox<>(ELEMENT_TYPE); |
||||
elementTypeBox.addActionListener(new ActionListener() { |
||||
@Override |
||||
public void actionPerformed(ActionEvent e) { |
||||
@SuppressWarnings("unchecked") |
||||
JComboBox<String> cb = (JComboBox<String>)e.getSource(); |
||||
if (cb.getSelectedIndex() == 0) { |
||||
elementType = Imgproc.CV_SHAPE_RECT; |
||||
} else if (cb.getSelectedIndex() == 1) { |
||||
elementType = Imgproc.CV_SHAPE_CROSS; |
||||
} else if (cb.getSelectedIndex() == 2) { |
||||
elementType = Imgproc.CV_SHAPE_ELLIPSE; |
||||
} |
||||
update(); |
||||
} |
||||
}); |
||||
sliderPanel.add(elementTypeBox); |
||||
|
||||
sliderPanel.add(new JLabel("Kernel size: 2n + 1")); |
||||
JSlider slider = new JSlider(0, maxKernelSize, 0); |
||||
slider.addChangeListener(new ChangeListener() { |
||||
@Override |
||||
public void stateChanged(ChangeEvent e) { |
||||
JSlider source = (JSlider) e.getSource(); |
||||
kernelSize = source.getValue(); |
||||
update(); |
||||
} |
||||
}); |
||||
sliderPanel.add(slider); |
||||
|
||||
pane.add(sliderPanel, BorderLayout.PAGE_START); |
||||
imgLabel = new JLabel(new ImageIcon(img)); |
||||
pane.add(imgLabel, BorderLayout.CENTER); |
||||
} |
||||
|
||||
private BufferedImage toBufferedImage(Mat matrix) { |
||||
int type = BufferedImage.TYPE_BYTE_GRAY; |
||||
if (matrix.channels() > 1) { |
||||
type = BufferedImage.TYPE_3BYTE_BGR; |
||||
} |
||||
int bufferSize = matrix.channels() * matrix.cols() * matrix.rows(); |
||||
byte[] buffer = new byte[bufferSize]; |
||||
matrix.get(0, 0, buffer); // get all the pixels
|
||||
BufferedImage image = new BufferedImage(matrix.cols(), matrix.rows(), type); |
||||
final byte[] targetPixels = ((DataBufferByte) image.getRaster().getDataBuffer()).getData(); |
||||
System.arraycopy(buffer, 0, targetPixels, 0, buffer.length); |
||||
return image; |
||||
} |
||||
|
||||
private void update() { |
||||
Mat element = Imgproc.getStructuringElement(elementType, new Size(2 * kernelSize + 1, 2 * kernelSize + 1), |
||||
new Point(kernelSize, kernelSize)); |
||||
|
||||
Imgproc.morphologyEx(matImgSrc, matImgDst, morphOpType, element); |
||||
BufferedImage img = toBufferedImage(matImgDst); |
||||
imgLabel.setIcon(new ImageIcon(img)); |
||||
frame.repaint(); |
||||
} |
||||
|
||||
public static void main(String[] args) { |
||||
// Load the native OpenCV library
|
||||
System.loadLibrary(Core.NATIVE_LIBRARY_NAME); |
||||
|
||||
// Schedule a job for the event dispatch thread:
|
||||
// creating and showing this application's GUI.
|
||||
javax.swing.SwingUtilities.invokeLater(new Runnable() { |
||||
@Override |
||||
public void run() { |
||||
new MorphologyDemo2(args); |
||||
} |
||||
}); |
||||
} |
||||
} |
@ -0,0 +1,63 @@ |
||||
from __future__ import print_function |
||||
import cv2 as cv |
||||
import numpy as np |
||||
import argparse |
||||
|
||||
erosion_size = 0 |
||||
max_elem = 2 |
||||
max_kernel_size = 21 |
||||
title_trackbar_element_type = 'Element:\n 0: Rect \n 1: Cross \n 2: Ellipse' |
||||
title_trackbar_kernel_size = 'Kernel size:\n 2n +1' |
||||
title_erosion_window = 'Erosion Demo' |
||||
title_dilatation_window = 'Dilation Demo' |
||||
|
||||
def erosion(val): |
||||
erosion_size = cv.getTrackbarPos(title_trackbar_kernel_size, title_erosion_window) |
||||
erosion_type = 0 |
||||
val_type = cv.getTrackbarPos(title_trackbar_element_type, title_erosion_window) |
||||
if val_type == 0: |
||||
erosion_type = cv.MORPH_RECT |
||||
elif val_type == 1: |
||||
erosion_type = cv.MORPH_CROSS |
||||
elif val_type == 2: |
||||
erosion_type = cv.MORPH_ELLIPSE |
||||
|
||||
element = cv.getStructuringElement(erosion_type, (2*erosion_size + 1, 2*erosion_size+1), (erosion_size, erosion_size)) |
||||
erosion_dst = cv.erode(src, element) |
||||
cv.imshow(title_erosion_window, erosion_dst) |
||||
|
||||
def dilatation(val): |
||||
dilatation_size = cv.getTrackbarPos(title_trackbar_kernel_size, title_dilatation_window) |
||||
dilatation_type = 0 |
||||
val_type = cv.getTrackbarPos(title_trackbar_element_type, title_dilatation_window) |
||||
if val_type == 0: |
||||
dilatation_type = cv.MORPH_RECT |
||||
elif val_type == 1: |
||||
dilatation_type = cv.MORPH_CROSS |
||||
elif val_type == 2: |
||||
dilatation_type = cv.MORPH_ELLIPSE |
||||
|
||||
element = cv.getStructuringElement(dilatation_type, (2*dilatation_size + 1, 2*dilatation_size+1), (dilatation_size, dilatation_size)) |
||||
dilatation_dst = cv.dilate(src, element) |
||||
cv.imshow(title_dilatation_window, dilatation_dst) |
||||
|
||||
parser = argparse.ArgumentParser(description='Code for Eroding and Dilating tutorial.') |
||||
parser.add_argument('--input', help='Path to input image.', default='../data/LinuxLogo.jpg') |
||||
args = parser.parse_args() |
||||
|
||||
src = cv.imread(args.input) |
||||
if src is None: |
||||
print('Could not open or find the image: ', args.input) |
||||
exit(0) |
||||
|
||||
cv.namedWindow(title_erosion_window) |
||||
cv.createTrackbar(title_trackbar_element_type, title_erosion_window , 0, max_elem, erosion) |
||||
cv.createTrackbar(title_trackbar_kernel_size, title_erosion_window , 0, max_kernel_size, erosion) |
||||
|
||||
cv.namedWindow(title_dilatation_window) |
||||
cv.createTrackbar(title_trackbar_element_type, title_dilatation_window , 0, max_elem, dilatation) |
||||
cv.createTrackbar(title_trackbar_kernel_size, title_dilatation_window , 0, max_kernel_size, dilatation) |
||||
|
||||
erosion(0) |
||||
dilatation(0) |
||||
cv.waitKey() |
@ -0,0 +1,48 @@ |
||||
from __future__ import print_function |
||||
import cv2 as cv |
||||
import numpy as np |
||||
import argparse |
||||
|
||||
morph_size = 0 |
||||
max_operator = 4 |
||||
max_elem = 2 |
||||
max_kernel_size = 21 |
||||
title_trackbar_operator_type = 'Operator:\n 0: Opening - 1: Closing \n 2: Gradient - 3: Top Hat \n 4: Black Hat' |
||||
title_trackbar_element_type = 'Element:\n 0: Rect - 1: Cross - 2: Ellipse' |
||||
title_trackbar_kernel_size = 'Kernel size:\n 2n + 1' |
||||
title_window = 'Morphology Transformations Demo' |
||||
morph_op_dic = {0: cv.MORPH_OPEN, 1: cv.MORPH_CLOSE, 2: cv.MORPH_GRADIENT, 3: cv.MORPH_TOPHAT, 4: cv.MORPH_BLACKHAT} |
||||
|
||||
def morphology_operations(val): |
||||
morph_operator = cv.getTrackbarPos(title_trackbar_operator_type, title_window) |
||||
morph_size = cv.getTrackbarPos(title_trackbar_kernel_size, title_window) |
||||
morph_elem = 0 |
||||
val_type = cv.getTrackbarPos(title_trackbar_element_type, title_window) |
||||
if val_type == 0: |
||||
morph_elem = cv.MORPH_RECT |
||||
elif val_type == 1: |
||||
morph_elem = cv.MORPH_CROSS |
||||
elif val_type == 2: |
||||
morph_elem = cv.MORPH_ELLIPSE |
||||
|
||||
element = cv.getStructuringElement(morph_elem, (2*morph_size + 1, 2*morph_size+1), (morph_size, morph_size)) |
||||
operation = morph_op_dic[morph_operator] |
||||
dst = cv.morphologyEx(src, operation, element) |
||||
cv.imshow(title_window, dst) |
||||
|
||||
parser = argparse.ArgumentParser(description='Code for More Morphology Transformations tutorial.') |
||||
parser.add_argument('--input', help='Path to input image.', default='../data/LinuxLogo.jpg') |
||||
args = parser.parse_args() |
||||
|
||||
src = cv.imread(args.input) |
||||
if src is None: |
||||
print('Could not open or find the image: ', args.input) |
||||
exit(0) |
||||
|
||||
cv.namedWindow(title_window) |
||||
cv.createTrackbar(title_trackbar_operator_type, title_window , 0, max_operator, morphology_operations) |
||||
cv.createTrackbar(title_trackbar_element_type, title_window , 0, max_elem, morphology_operations) |
||||
cv.createTrackbar(title_trackbar_kernel_size, title_window , 0, max_kernel_size, morphology_operations) |
||||
|
||||
morphology_operations(0) |
||||
cv.waitKey() |