Java图像分割Demo技术咨询:修改鼠标交互时的非灰度图像显示
Java Swing图像分割Demo:替换灰度效果为其他图像样式
现有基于Java Swing的图像分割Demo通过ColorConvertOp将原图转为灰度图,鼠标拖动分割线时,线上方显示灰度图。需求是修改代码,让分割线上方显示灰度以外的其他图像效果,以下是完整代码及解决方案:
现有Demo主类代码
import java.awt.event.*; import java.awt.image.*; import java.awt.*; import java.awt.color.*; import java.io.*; import javax.imageio.*; import javax.swing.*; // 이미지유틸리티.java, 이미지분할.java public class Image_Segmentation_Demo extends JComponent{ public static void main(String[] args) { JFrame f = new JFrame(); String FName = "Hok1.png"; 이미지분할 Seg = new 이미지분할(FName); BufferedImage Source = Seg.getImage(); // BufferedImageOp Target = new BufferedImage(ImageIO.write("example.jpg")); BufferedImageOp Target = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null); BufferedImage Ref = Target.filter(Source, null); Seg.setSecondImage(Ref); f.setLayout(new BorderLayout()); f.add(Seg, BorderLayout.CENTER); f.setSize(f.getPreferredSize()); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setLocationRelativeTo(null); f.setVisible(true); } }
이미지분할(图像分割)类完整代码
import java.awt.*; import java.awt.event.*; import java.awt.image.BufferedImage; import java.awt.geom.Line2D; import javax.swing.*; public class 이미지분할 extends JPanel { private BufferedImage 이미지; private BufferedImage 두번째이미지; private int 분할x; public 이미지분할(String 경로) { setImage(경로); init(); } public 이미지분할(BufferedImage 버퍼이미지) { setImage(버퍼이미지); init(); } public void setImage(String 경로) { Image 버퍼이미지 = 이미지유틸리티.로드봉쇄(경로); 이미지 = 이미지유틸리티.이미지버퍼생성(버퍼이미지); } public void setImage(BufferedImage 버퍼이미지) { 이미지 = 버퍼이미지; } public void setSecondImage(BufferedImage 버퍼이미지) { 두번째이미지 = 버퍼이미지; repaint(); } public BufferedImage getImage() { return 이미지; } public BufferedImage getSecondImage() { return 두번째이미지; } private void init() { setBackground(Color.white); addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent me) { 분할x = me.getY(); repaint(); } }); addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent me) { 분할x = me.getY(); repaint(); } }); } public void paint(Graphics g) { Graphics2D g2 = (Graphics2D)g; int width = getSize().width; int height = getSize().height; // 清空窗口 Rectangle clear = new Rectangle(0, 0, width, height); g2.setPaint(getBackground()); g2.fill(clear); // 裁剪显示原图区域 if (분할x != 0 && 두번째이미지 != null) { Rectangle 첫번째클립 = new Rectangle(0, 분할x, width, height - 분할x); g2.setClip(첫번째클립); } g2.drawImage(getImage(), 0, 0, null); if (분할x == 0 || 두번째이미지 == null) return; // 裁剪显示效果图像区域 Rectangle 두번째클립 = new Rectangle(0, 0, width, 분할x); g2.setClip(두번째클립); g2.drawImage(두번째이미지, 0, 0, null); // 绘制分割线 Line2D 분할선 = new Line2D.Float(0, 분할x, width, 분할x); g2.setClip(null); g2.setColor(Color.white); g2.draw(분할선); } public Dimension getPreferredSize() { int width = getImage().getWidth(); int height = getImage().getHeight(); if (두번째이미지 != null) { width = Math.max(width, 두번째이미지.getWidth()); height = Math.max(height, 두번째이미지.getHeight()); } return new Dimension(width, height); } }
替换灰度效果的解决方案
只需替换Demo主类中BufferedImageOp Target = new ColorConvertOp(...)这一行代码,以下是几种常见效果的实现:
1. 颜色反转效果
通过自定义BufferedImageOp实现:
BufferedImageOp Target = new BufferedImageOp() { @Override public BufferedImage filter(BufferedImage src, BufferedImage dest) { if (dest == null) { dest = new BufferedImage(src.getWidth(), src.getHeight(), src.getType()); } for (int y = 0; y < src.getHeight(); y++) { for (int x = 0; x < src.getWidth(); x++) { int rgb = src.getRGB(x, y); int r = 255 - ((rgb >> 16) & 0xFF); int g = 255 - ((rgb >> 8) & 0xFF); int b = 255 - (rgb & 0xFF); dest.setRGB(x, y, (rgb & 0xFF000000) | (r << 16) | (g << 8) | b); } } return dest; } @Override public Rectangle2D getBounds2D(BufferedImage src) { return new Rectangle(src.getWidth(), src.getHeight()); } @Override public BufferedImage createCompatibleDestImage(BufferedImage src, ColorModel destCM) { return null; } @Override public Point2D getPoint2D(Point2D srcPt, Point2D dstPt) { return null; } @Override public RenderingHints getRenderingHints() { return null; } };
2. 边缘检测(索贝尔算子)
使用ConvolveOp实现边缘检测:
// 索贝尔X方向卷积核 float[] sobelX = { -1, 0, 1, -2, 0, 2, -1, 0, 1 }; Kernel kernel = new Kernel(3, 3, sobelX); BufferedImageOp Target = new ConvolveOp(kernel, ConvolveOp.EDGE_NO_OP, null);
3. 高斯模糊效果
// 模糊半径设为5,可调整数值改变模糊程度 BufferedImageOp Target = new GaussianBlurOp(5);
注:GaussianBlurOp在Java 9+可用,低版本可自定义实现。
4. 暖色调偏移
通过RescaleOp调整RGB通道亮度:
// 增强红色通道,减弱蓝色通道 float[] scales = {1.2f, 1.0f, 0.8f, 1.0f}; // R, G, B, Alpha float[] offsets = {0, 0, 0, 0}; BufferedImageOp Target = new RescaleOp(scales, offsets, null);
替换后运行Demo,拖动分割线即可看到对应效果显示在分割线上方。
内容的提问来源于stack exchange,提问作者user20654610
相关产品推荐
相关产品推荐

