彩色图片一个像素是有RGB3色,就算用int保存的话,一个Int 4个字节,也要12个字节,需要转换成单色灰色,这样就只需要一个数字来表示颜色了,从而降低了维度,并节约了内存
import java.awt.image.BufferedImage import java.io.File import javax.imageio.ImageIO import org.apache.spark.mllib.linalg.Vectors /** * Created by xiaojun on 2016/3/18. */ object ImageTest { def main(args: Array[String]): Unit = { val inputPath = "d:\\test.jpg" val width = 50 val height = 50 val pixels = extractPixels(inputPath, width, height) //将图片转换成向量表示 val imageVector = Vectors.dense(pixels) println(imageVector.toArray.take(10).mkString("",","," , ...")) } def loadImageFromFile(path: String) = { ImageIO.read(new File(path)) } //降低维度,将彩色图片转变成单色灰色图片 def processImage(image: BufferedImage, width: Int, height: Int) = { val grayImage = new BufferedImage(width, height, BufferedImage.TYPE_BYTE_GRAY) val g = grayImage.getGraphics g.drawImage(image, 0, 0, width, height, null) g.dispose() // ImageIO.write(grayImage,"jpg",new File("d:\\gray2.jpg")) grayImage } //获得图片的所有像素,保存在数组中 def getPixelsFromImage(image: BufferedImage) = { val width = image.getWidth val height = image.getHeight val pixels = Array.ofDim[Double](width * height) image.getData.getPixels(0, 0, width, height, pixels) } def extractPixels(path: String, width: Int, height: Int) = { val raw = loadImageFromFile(path) val grayImage = processImage(raw, width, height) getPixelsFromImage(grayImage) } }