作者csihcs (非天夜翔)
看板java
标题Re: [问题] 二值化的程式码修改
时间Sat May 30 03:09:48 2009
※ 引述《inmorelong (InMoreLong)》之铭言:
以下是小弟所写的程式码
import javax.imageio.*; // for ImageIO
import java.io.*; // for File
import java.awt.Color;
import java.awt.image.*; // for BufferedImage
import javax.swing.*; // for JFrame
public class Binerize{
public static void main(String[] args){
File file = new File("C:\\0001.jpg");
if(!file.exists()){
JOptionPane.showMessageDialog(null,"File does not Exists!");
System.exit(0);
}
try {
BufferedImage image = ImageIO.read(file);
final int width = image.getWidth();
final int height = image.getHeight();
final int[][] pixel = new int[height][width];
int rgb = 0;
for (int y = 0; y < height; y++){
for (int x = 0; x < width; x++) {
rgb = image.getRGB(x, y);
rgb = (((rgb>>16)&0xff)+((rgb>>8)&0xff)+(rgb&0xff))/3;
rgb &= 0xff;
pixel[y][x] = ((rgb)<<16) + ((rgb)<<8) + rgb;
// 上面这行设定又有何意义
// 马上又被下面那段红色洗掉了
// 所以就可以把他注解掉
if(rgb < 68) {
pixel[y][x] = 0;
} else {
pixel[y][x] = 255;
}
Color off = new Color(pixel[y][x],pixel[y][x],pixel[y][x]);
image.setRGB(x, y, off.getRGB());
// 然而其实你只是要黑与白而已,何必 new 新的 Color 物件??
// 把红色到黄色那段改成
if(rgb < 68) {
image.setRGB(x,y, Color.BLACK.getRGB());
} else {
image.setRGB(x,y, Color.WHITE.getRGB());
}
}
}
File newfile = new File("C:\\0003.jpg");
for (int y = 0; y < height; y++){
for (int x = 0; x < width; x++) {
image.setRGB(x, y, pixel[y][x]);
}
}
// 上面这两个 for-loop 有何用途???
// 这不就把黄色那行设定的 rgb 洗掉了
// 所以把这段注解掉
ImageIO.write(image, "jpg", newfile);
} catch (IOException e) {
JOptionPane.showMessageDialog(null,"IO ERROR!");
}
}
}
// 改完之後深蓝色那行又变得不需要了,因此又可以注解掉
以上是我先前写好的程式码
目的是要把一张彩色图片先转成灰阶,再转为二值化(黑白)
但不知道为什麽,白色的部份终究会变蓝色的...
^^
// 其实会变成蓝色的原因并不是你说的地方,而是粉红色的地方
// 因为原本要是白色的地方你的 pixel[y][x] 会是 255
// setRBG(x,y,255) 就会让他变成了蓝色
有思考过应该是这行
Color off = new Color(pixel[y][x],pixel[y][x],pixel[y][x]);
似乎是这边出了问题,但不知道怎修改才好...
希望各位高手们不吝指教,帮帮小弟!! 感谢!!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 122.100.78.56
1F:推 tkcn:image.setRGB(x, y, pixel[y][x]); 这行错了吧? 05/30 01:56
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 211.74.9.2
2F:→ csihcs:rgb = (((rgb>>16)&0xff)+((rgb>>8)&0xff)+(rgb&0xff))/3; 05/30 03:19
因为这句 rgb 一定是在 0 ~ 0xff 之间
所以他下面的 rgb &= 0xff 变成了多此一举
※ 编辑: csihcs 来自: 211.74.9.2 (05/30 03:21)
3F:推 inmorelong:成功了!! 真的很感谢您 Q_______________________Q 05/30 12:29