我正在尝试做我原来认为很简单的事情。以机智:对于输入文件列表中的每个文件:用png.Decode()打开文件扫描文件中的每个像素并测试其是否为“灰色”。返回图像中“灰色”像素的百分比。这是我正在调用的函数:func greyLevel(fname string) (float64, string) { f, err := os.Open(fname) if err != nil { return -1.0, "can't open file" } defer f.Close() i, err := png.Decode(f) if err != nil { return -1.0, "unable to decode" } bounds := i.Bounds() var lo uint32 = 122 // Low grey RGB value. var hi uint32 = 134 // High grey RGB value. var gpix float64 // Grey pixel count. var opix float64 // Other (non-grey) pixel count. var tpix float64 // Total pixels. for x := bounds.Min.X; x < bounds.Max.X; x++ { for y := bounds.Min.Y; y < bounds.Max.Y; y++ { r, g, b, _ := i.At(x, y).RGBA() if ((r/255)-1 > lo && (r/255)-1 < hi) && ((g/255)-1 > lo && (g/255)-1 < hi) && ((b/255)-1 > lo && (b/255)-1 < hi) { gpix++ } else { opix++ } tpix++ } } return (gpix / tpix) * 100, ""} func main() { srcDir := flag.String("s", "", "Directory containing image files.") threshold := flag.Float64("t", 65.0, "Threshold (in percent) of grey pixels.") flag.Parse() dirlist, direrr := ioutil.ReadDir(*srcDir) if direrr != nil { log.Fatalf("Error reading %s: %s\n", *srcDir, direrr) } for f := range dirlist { src := path.Join(*srcDir, dirlist[f].Name()) level, msg := greyLevel(src) if msg != "" { log.Printf("error processing %s: %s\n", src, msg) continue } if level >= *threshold { log.Printf("%s is grey (%2.2f%%)\n", src, level) } else { log.Printf("%s is not grey (%2.2f%%)\n", src, level) } }}
2 回答

慕雪6442864
TA贡献1812条经验 获得超5个赞
看来您使用的是32位计算机。因为Go的垃圾回收器很保守,所以程序可能内存不足。保守的垃圾收集器可能无法检测到不再使用某些内存区域。目前在比避免数据结构,垃圾收集器无法处理其他围棋程序没有解决此(如:struct {...; binaryData [256]byte}
)
尝试runtime.GC()
在要调用function的循环的每个迭代中调用greyLevel
。也许它将帮助程序处理更多图像。
如果调用runtime.GC()
无法改善情况,则可能需要更改策略,以便该程序每次运行处理较少数量的PNG文件。
- 2 回答
- 0 关注
- 338 浏览
添加回答
举报
0/150
提交
取消