提取图像边缘
利用java打開一張圖片,并提取其邊緣。功能有打開文件,以及提取邊緣。
算法原理
由于邊緣提取的算法有很多種,而提取的精度在相同閾值的情況下也會有不同的結果。
這次我的邊緣提取使用索貝爾算子(Sobel operator)。
該算子會把圖像每一點的灰度矢量計算出來。而分別為橫向及縱向,將之與圖像作平面卷積,即可分別得出橫向及縱向的亮度差分近似值。
算法核心:
public int getGrayPoint(int x, int y) {return grayData[y * width + x];}protected final int GradientX(int x, int y) {return getGrayPoint(x - 1, y - 1) + 2*getGrayPoint(x - 1, y)+ getGrayPoint(x - 1, y + 1) - getGrayPoint(x + 1, y - 1)- 2*getGrayPoint(x + 1, y) - getGrayPoint(x + 1, y + 1);}protected final int GradientY(int x, int y) {return getGrayPoint(x - 1, y - 1) + 2*getGrayPoint(x, y - 1)+ getGrayPoint(x + 1, y - 1) - getGrayPoint(x - 1, y + 1)- 2*getGrayPoint(x, y + 1) - getGrayPoint(x + 1, y + 1);
而利用JAVA 的GUI界面將圖片打開且直接進行操作:
setTitle("Test");setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);label = new JLabel();add(label);chooser = new JFileChooser();chooser.setCurrentDirectory(new File("."));JMenuBar menubar = new JMenuBar();setJMenuBar(menubar);JMenu menu = new JMenu("文件");JMenu menu2 = new JMenu("操作");menubar.add(menu);menubar.add(menu2);JMenuItem openItem = new JMenuItem("打開");JMenuItem Clicktime = new JMenuItem("提取邊緣");menu.add(openItem);menu2.add(Clicktime);JMenuItem exitItem = new JMenuItem("關閉");menu.add(exitItem);SobelEdgeDetect tp=new SobelEdgeDetect(50);openItem.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent arg0) {// TODO Auto-generated method stubint result = chooser.showOpenDialog(null);if(result == JFileChooser.APPROVE_OPTION){String name = chooser.getSelectedFile().getPath();label.setIcon(new ImageIcon(name));try {tp.readImage(name);} catch (IOException ex) {Logger.getLogger(ImageViewerFrame.class.getName()).log(Level.SEVERE, null, ex);}}}});exitItem.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent arg0) {// TODO Auto-generated method stubSystem.exit(0);}});Clicktime.addActionListener(new ActionListener() {private int heightWMI;@Overridepublic void actionPerformed(ActionEvent e) {String desImageName = "1.jpg";tp.createEdgeImage(desImageName);label.setIcon(new ImageIcon(desImageName));}});}private JLabel label;private JFileChooser chooser;private static final int DEFAULT_WIDTH = 1280;private static final int DEFAULT_HEIGHT =800;執行后可將圖片邊緣提取:(這里設定閾值為50)
預覽:
?
轉載于:https://www.cnblogs.com/Stringair/p/6250092.html
總結
- 上一篇: Javascript中的valueOf与
- 下一篇: C语言 · 数位分离