2014-03-28 57 views
0

我想要将RGB图像转换为HSV并最终返回gray_scale图像。我已经得到了下面的代码,以便读取和转换我的形象:在java中将RGB图像转换为gray_scale HSV

BufferedImage lum = new BufferedImage(original.getWidth(), original.getHeight(), original.getType()); 

    for(int i=0; i<original.getWidth(); i++) { 
     for(int j=0; j<original.getHeight(); j++) { 

      // Get pixels by R, G, B 
      alpha = new Color(original.getRGB(i, j)).getAlpha(); 
      red = new Color(original.getRGB(i, j)).getRed(); 
      green = new Color(original.getRGB(i, j)).getGreen(); 
      blue = new Color(original.getRGB(i, j)).getBlue(); 

      float[] hsv = Color.RGBtoHSB(red, green, blue, null); 
      int hue = (int) Math.round(360 * hsv[0]); 

      red = (int) (0.21 * red + 0.71 * green + 0.07 * blue); 
      // Return back to original format 
      newPixel = colorToRGB(alpha, red, red, red); 

      // Write pixels into image 
      lum.setRGB(i, j, hue); 

     } 
    } 

    return lum; 

什么都为了返回HSV gray_scale形象呢?上述是否是正确的方式?

+0

如果你只是转换成灰度图,为什么还要用HSV? –

+0

我实际上对使用色调通道感兴趣。 –

+0

是否可以从计算出的hsv频道创建一个bufferedimage?转换后的过程。 –

回答

1

这是很容易与JavaCV [OpenCV的包装为Java]

IplImage originalImage = cvLoadImage("path of input image", 1); 
IplImage grayImage = IplImage.create(originalImage.width(),originalImage.height(), IPL_DEPTH_8U, 1); 
cvCvtColor(originalImage, grayImage, CV_BGR2GRAY); 
cvSaveImage("path of output image", originalImage); 

,或者如果你想实现它在纯java,使用下面的代码

import com.sun.image.codec.jpeg.JPEGCodec; 
import com.sun.image.codec.jpeg.JPEGImageDecoder; 
import com.sun.image.codec.jpeg.JPEGImageEncoder; 
import java.awt.color.ColorSpace; 
import java.io.*; 
import java.awt.image.*; 
import javax.imageio.ImageIO; 

公共类灰度{

public static void convertToGrayscale() throws Exception { 

    JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(new FileInputStream(new  File("a.jpg"))); 
    JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(new FileOutputStream("b.jpg")); 
    BufferedImage sourceImg = decoder.decodeAsBufferedImage(); 
    BufferedImageOp op = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null); 
    BufferedImage destImg = op.filter(sourceImg, null); 
    encoder.encode(destImg); 
    decoder = null; 
    encoder = null; 

}

public static void main(String[] args) throws Exception { 

    GrayScale.convertToGrayscale(); 

} 

}

+0

基本上我想读取我的bufferedImage并返回色调通道。 –