我想检测给定二进制图像中的所有角度,图像包含一个手写字符(白底黑字),有没有一种方法可以 100% 准确地获得线交界处的角度?
我目前的解决方案(如下)确实找到了角度,但有时它会找到不需要的角度——即靠近交界处的角度,而不是正好在它上面(下面是一个例子)。在这个实现中,我使用 Magick.net,
因为我不能发布两个以上的链接,所以我会发布假设是带有蓝色标记的二进制图像的输入字母图像,这些蓝色标记是我想要检测的角度的位置 - 要获得输入二进制图像,它们需要被删除(抱歉)。 字母 A
我的代码:
var image = new MagickImage(@"xImg.jpg");
const int Radius = 3;//angle points surrounding circle radius
image.Grayscale(PixelIntensityMethod.Average); //redundent
var lineJunctionsImage = image.Clone(); // an image that will contain only the lines junctions points - angle points
//detect all lines junctions points (black pixels points) in the image
//with morphology method HAM + lineJunction kernel
lineJunctionsImage.Negate();
lineJunctionsImage.Morphology(MorphologyMethod.HitAndMiss, Kernel.LineJunctions);
lineJunctionsImage.Negate();
结果点应该是连接点中间的点,但有些点不准确,对我来说很关键,因为我想画一个围绕它们的圆,然后取点和两点之间的角度与圆相交,现在,下一个代码正在执行此操作,但它复杂且冗长,所以我只在此处编写算法:
对于每个连接点 p 执行:检测与围绕 p 的上述半径 (3) 的圆相交的所有黑色像素 bi(0 >= i),对于每个 bi 对计算 p 之间的角度,并打印找到的角度以下协议:{point1} {角度点} {点 2} 角度
找到的角度(标记的角度点(中间连接点)):
{11,19} {8,17} {5,19} 112.619
{11,19} {8,17} {9,14} 105.255
{5,19} {8,17} {9,14} 142.12
{24,17} {21,20} {18,19} 116.56
{24,17} {21,20} {20,23} 90
{21,1} {24,0} {27,2} 127.87
{24,0} {27,2 } {27,5 } 123.7
{26,12} {27,9} {27,6} 161.56
我认为主要问题是角度点有时不是正确的点,而是近邻。
也许有人有更好更准确的想法,可以找到正确的角度。