java BufferedImage像素操作的问题

长桥卧雪 2015-05-02 02:49:16
各位前辈好。
我在将一个图像转化为2值图像后,想进行如下操作:
将图像划分为7*7个小块,如果某一小块中的黑像素值大于30%,则在图中显示此小块,否则不显示。

可见达到目的了,但是如果我想将小块数量增多,比如,增加到40*40的时候,就无法得到想要的结果:

想问下为什么会出现这种情况,难道是空白处有黑点干扰吗?
...全文
868 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
长桥卧雪 2015-05-04
  • 打赏
  • 举报
回复
滤波问题解决后,我看了一下我的代码,发现原来出问题的地方全部都是因为对象引用问题出现的。 我把所有应该重新创建对象的地方改了之后,所有和预想不一致的乌龙问题就全部解决了。 至此结贴,感谢各位的帮助。 特别感谢@飏飏一蝶 愿各位一切顺利,代码不改都过
长桥卧雪 2015-05-04
  • 打赏
  • 举报
回复
我明白了,是不是fbi=bi,其实fbi和bi所指向的还是同一个图像所以我赋值之后就会影响到之后函数的判断。而我修改程序后,因为是另起了一个缓冲区,所以就没问题了。原来如此。
飏飏一蝶 2015-05-04
  • 打赏
  • 举报
回复
fbi和bi你指向的是同一个图片……哪是复制的一份啊……
长桥卧雪 2015-05-04
  • 打赏
  • 举报
回复
把filtrate()函数的第一句改成: BufferedImage fbi = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_BYTE_BINARY); 似乎就好了,不知道为什么
长桥卧雪 2015-05-04
  • 打赏
  • 举报
回复
程序中又发现了一个问题:
	public void filtrate(){
BufferedImage fbi = bi;
int bi_width = bi.getWidth();
int bi_height = bi.getHeight();
for(int i = 1;i < bi_width-1;++ i){
for(int j = 1;j < bi_height-1;++ j){
int blackCount = 0;
for(int temp1 = -1;temp1 <=1;++ temp1){
for(int temp2 = -1;temp2 <= 1;++ temp2)
if(MusicHelper.isBlack(bi, i+temp1, j+temp2)){
blackCount ++;
if((i == 250) && (j == 200)){
System.out.println(i+temp1+", "+j+temp2);
}
}
}
if(blackCount >= 4)
fbi.setRGB(i, j, 0xff000000);
else {
fbi.setRGB(i, j, 0xffffffff);
}
}
}
setBi(fbi);
}

其中,i=250,j=200的点,基本位置入图所示:

按道理说,此点旁边应该都是白点才对,但是,此段程序文字输出的结果是:
249, 200-1
249, 2000
249, 2001
250, 200-1
且输出的图像结果即上面第三个图片。
更加奇怪的是,我将滤波的点数由4改为5后(即blackcount>=5),此时程序文字输出为空,且图像输出结果是:
长桥卧雪 2015-05-04
  • 打赏
  • 举报
回复
引用 8 楼 qq118194716 的回复:
几点疑问 1、好奇怪的滤波,你是按每个点为中心,然后计算点周围3*3范围内有多少个黑块来确定中心点显式不显式的吧 4/9= 44.4% 你的30%怎么确认的? 2、你的滤波没什么问题,但是你这个设值有点问题,你应该另起一个图像,滤波后对应赋值,这样才不会出现因为你的计算结果赋值影响到下一个点的计算。就好比一团墨水,你手一带,那一团全黑了~.... 不知道你明白我的意思没....
我想我明白你的意思了,但是bi是原图,我判断的时候用的是bi,然后赋值得到新图的时候用的是fbi啊,这样应该可以的吧?
youzi05 2015-05-04
  • 打赏
  • 举报
回复
引用 8 楼 qq118194716 的回复:
几点疑问 1、好奇怪的滤波,你是按每个点为中心,然后计算点周围3*3范围内有多少个黑块来确定中心点显式不显式的吧 4/9= 44.4% 你的30%怎么确认的? 2、你的滤波没什么问题,但是你这个设值有点问题,你应该另起一个图像,滤波后对应赋值,这样才不会出现因为你的计算结果赋值影响到下一个点的计算。就好比一团墨水,你手一带,那一团全黑了~.... 不知道你明白我的意思没....
我估计lz的意思是3/9≈30%,所以大于30%就是大于3/9,所以是4块 我觉得第2点说的很对,假设说原图像是这样的(#号表示黑块,数字为标记。3X5) ##### #12 # ##### 那么,当i=1,j=2的时候就有意思了,这个时候应该画1这块了,左边和上边总共4块,黑色。然后j=3,由于1是黑的,那么,对于2来说,左边和上边4块黑的,黑色。问题就出来这里,原本只应该1是黑色的,现在2也变成黑色的了 这应该是@qq118194716的意思吧。。。
飏飏一蝶 2015-05-03
  • 打赏
  • 举报
回复
几点疑问 1、好奇怪的滤波,你是按每个点为中心,然后计算点周围3*3范围内有多少个黑块来确定中心点显式不显式的吧 4/9= 44.4% 你的30%怎么确认的? 2、你的滤波没什么问题,但是你这个设值有点问题,你应该另起一个图像,滤波后对应赋值,这样才不会出现因为你的计算结果赋值影响到下一个点的计算。就好比一团墨水,你手一带,那一团全黑了~.... 不知道你明白我的意思没....
长桥卧雪 2015-05-03
  • 打赏
  • 举报
回复
求帮助。。暗自垂泪
长桥卧雪 2015-05-02
  • 打赏
  • 举报
回复
顶顶顶顶顶顶
长桥卧雪 2015-05-02
  • 打赏
  • 举报
回复
引用 4 楼 qq_27874423 的回复:
好奇怪的问题,可惜我不懂,帮顶一个
谢谢,我也觉得好奇怪
qq_27874423 2015-05-02
  • 打赏
  • 举报
回复
好奇怪的问题,可惜我不懂,帮顶一个
长桥卧雪 2015-05-02
  • 打赏
  • 举报
回复
顶顶顶
长桥卧雪 2015-05-02
  • 打赏
  • 举报
回复
顶顶顶
长桥卧雪 2015-05-02
  • 打赏
  • 举报
回复
我试图进行滤波:
BufferedImage fbi = bi;
int bi_width = bi.getWidth();
int bi_height = bi.getHeight();
for(int i = 1;i < bi_width-1;++ i){
for(int j = 1;j < bi_height-1;++ j){
int blackCount = 0;
for(int temp1 = -1;temp1 <=1;++ temp1){
for(int temp2 = -1;temp2 <= 1;++ temp2)
if(MusicHelper.isBlack(bi, i+temp1, j+temp2)){
blackCount ++;
}
}
if(blackCount >= 4)
fbi.setRGB(i, j, 0xff000000);
else {
fbi.setRGB(i, j, 0xffffffff);
}

结果如图所示:


求教。

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧