我有一个RGB图像。假设说我有两个圆圈。我想知道哪一个填充,哪一个不填。我按照以下步骤操作: - 将图像导入为位图
- 转换为灰度并使用CannyEdgeDetector过滤器查找边缘。我得到以下图片
包含字母“D”的圆圈给出两条边,其中我只需要一条圆边。其次,我如何找出哪个圆圈被填充,哪个圆圈没有填充。
答案 0 :(得分:3)
对于MCQ答案表,可能更容易通过圈子的位置。
只需将清晰的圆圈A,B,C和D的图像与扫描图像进行比较,然后查看最不同的图像。简单的黑暗总和就足够了。
另外:将圆圈相互比较也可能有助于补偿坏/暗/浅扫描或脏污纸张。
对于特殊情况,如果测试不完全确定,我可能会将其传递给人类进行进一步调查。例如,当你允许学生通过圈出他们的第二次猜测或当学生决定使用坏橡皮擦制造一个真正的混乱时撤消答案。
最后提示:确保您不接受填充正确圆圈的答案;确保其他圈子同时清晰,这样学生就不会因为填满所有圈子而作弊。 (有些教授使用纸质面具覆盖所有不良答案,因此他们可以快速找到无标记的正确答案。但如果学生只是标记所有答案,那么这将失败很长时间。)
答案 1 :(得分:2)
我不知道任何符合您标准的“正式”算法。我也怀疑你会发现任何。
当你说圆圈“变暗”时,可以解释为:“许多像素(高于人口阈值)将是黑色,或者至少是黑暗(高于颜色阈值)。”基于已知的圆和半径,我会遵循这种方法(用伪代码编写,但我想你得到了意义):
//define thresholds
colourThreshold=...
populationThreshold=...
centerPoint = getCircleCenter();
radius = getCircleRadius();
darkPixelsCount = 0;
for(x=centerPoint.X-radius;x<centerPoint.X+radius;x++){
for(y=centerPoint.Y-sqrt(abs(radius^2-(x - centerPoint.X)^2));centerPoint.Y+sqrt(abs(radius^2-(x - centerPoint.X)^2));y++){
if (image(x, y) > colourThreshold){
darkPixelsCounter++;
if(darkPixelsCounter > populationThreshold){
//If you reach this point, circle has been darkened
return;
}
}
}
}
//If you reach this point, circle has not been darkened
return;
我不知道它是否有效,或者是否有更优雅的方式来做到这一点。我想你可以通过调节阈值来发挥性能和准确性。
希望我帮忙!
答案 2 :(得分:0)
执行斑点检测,像素数
甚至更简单地计算黑色像素
甚至更简单,更快,取中间线并计算它从白色切换到黑色的频率