Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image processing 检测图像中的一张纸,如cam扫描仪应用程序_Image Processing_Hough Transform_Canny Operator_Image Thresholding_Adaptive Threshold - Fatal编程技术网

Image processing 检测图像中的一张纸,如cam扫描仪应用程序

Image processing 检测图像中的一张纸,如cam扫描仪应用程序,image-processing,hough-transform,canny-operator,image-thresholding,adaptive-threshold,Image Processing,Hough Transform,Canny Operator,Image Thresholding,Adaptive Threshold,从图像中,我需要提取一张纸,就像camscanner应用程序一样 我知道我可以通过检测我想要检测的纸张的边缘来做到这一点。然后执行透视变换。我在python中使用openCV库。 这是我试图在其中查找纸张的图像: () 以下是我已经尝试过的: 方法1: (使用阈值) 使用图像平滑(guassian)对图像进行预处理 模糊/双边模糊) 将图像分割为h、s、v通道 饱和信道上的自适应阈值 一些形态学操作,如膨胀和侵蚀 查找等高线,确定最大等高线并查找 角点 我根据stackoverflow答案实现了

从图像中,我需要提取一张纸,就像camscanner应用程序一样

我知道我可以通过检测我想要检测的纸张的边缘来做到这一点。然后执行透视变换。我在python中使用openCV库。 这是我试图在其中查找纸张的图像:

() 以下是我已经尝试过的:

方法1: (使用阈值)

  • 使用图像平滑(guassian)对图像进行预处理 模糊/双边模糊)
  • 将图像分割为h、s、v通道
  • 饱和信道上的自适应阈值
  • 一些形态学操作,如膨胀和侵蚀
  • 查找等高线,确定最大等高线并查找 角点 我根据stackoverflow答案实现了此方法: 链接: 我可以找到一些图像的纸张,但对于这样的图像它失败了:
  • ()

    方法2: (使用sobel梯度算子)

  • 通过转换为灰度对图像进行预处理,图像平滑(guassian 模糊/双边模糊)
  • 寻找图像的梯度
  • 对图像进行下采样和上采样
  • 在此之后,我不知道如何找到包围图像的适当边界。 我根据stackoverflow答案实现了此方法: 链接: 以下是我对图像的理解程度:
  • ()

    方法3: (使用canny边缘检测器)

    根据我在这个社区上读到的帖子,似乎每个人都喜欢用精明的边缘方法来提取边缘,但在我的例子中,结果并不令人满意。以下是我所做的:

  • 通过转换为灰度对图像进行预处理,图像平滑(guassian 模糊/双边模糊)
  • 利用canny边缘提取边缘
  • 一些形态学操作,如膨胀和侵蚀
  • 但从canny获得的边缘确实不符合要求。 我根据stackoverflow答案实现了此方法: Link:,我也不太清楚他在这个答案中通过多个通道迭代做了什么。 以下是我对图像的理解程度:
  • ()

    下面是有关method1(阈值化)的一些代码:

    #将图像读入BGR空间
    image=cv2.imread(“./images/sheet3.png”)
    #双边滤波以平滑图像,但不平滑边缘
    img=cv2.双边过滤器(图,20,75,75)
    #将BGR转换为HSV
    hsv=cv2.CVT颜色(img,cv2.COLOR\U BGR2HSV)
    #分割HSV频道
    h、 s,v=cv2.分流(hsv)
    #双倍饱和通道
    灰色=cv2.addWeighted(cv2.CVT颜色(img,cv2.COLOR\u BGR2GRAY),0.0,s,2.0,0)
    #自适应阈值分割
    阈值=cv2。自适应阈值(灰色,255,cv2。自适应阈值平均值,cv2。阈值二进制值,109,10)
    #应用膨胀和侵蚀的形态学运算
    kernel=cv2.getStructuringElement(cv2.morp_RECT,(2,2))
    morph=cv2.morphologyEx(脱粒,cv2.morph_开放,内核)
    #寻找所有的轮廓
    cnts=cv2.findContours(变形、cv2.RETR\u列表、cv2.CHAIN\u近似简单)[-2]
    canvas=img.copy()
    #对轮廓进行排序并获取最大轮廓
    cnts=已排序(cnts,键=cv2.轮廓面积)
    碳纳米管=碳纳米管[-1]
    #求轮廓的周长
    弧长=cv2.弧长(cnt,真)
    #通过近似多边形DP查找轮廓的端点
    近似值=cv2.近似聚合度(cnt,0.02*arclen,真值)
    cv2.绘制轮廓图(画布,[cnt],-1,(255,0,0),1,cv2.线条图AA)
    cv2.绘制轮廓(画布,[近似值],-1,(0,0,255),1,cv2.线条_AA)
    cv2.imwrite(“detected.png”,canvas)
    
    我对图像处理和openCV有点陌生。
    请分享一些关于如何更进一步,更准确地获得结果的见解。TIA。

    对于此类问题,边缘检测通常表现不佳。喜欢区域检测,如方法1(可能具有自适应阈值,并尽可能利用颜色)。对于像这样的情况,放弃这个想法,任何东西都不会可靠地工作。@YvesDaoust我的想法是一样的,正如你在我上面提到的代码中所看到的,我使用了自适应阈值,因为每个像素的阈值都会改变,上述方法也不会产生准确的结果,例如,这幅图像:,这是阈值图像:不要期待奇迹,但使用更大的过滤器(不要满足于一次尝试)。还可以查看其他分段方法。请搜索现有的问题和答案。我感觉像是一天两次检测到一张纸被带到这里。@Pigger我所写的所有上述代码都来自以前的答案,尽管正如我所提到的,这些答案对某些图像不适用,例如:I.imgur.com/e6tVjaR.png。我只是要求做一些额外的处理。对于此类问题,莎草检测通常表现不佳。喜欢区域检测,如方法1(可能具有自适应阈值,并尽可能利用颜色)。对于像这样的情况,放弃这个想法,任何东西都不会可靠地工作。@YvesDaoust我的想法是一样的,正如你在我上面提到的代码中所看到的,我使用了自适应阈值,因为每个像素的阈值都会改变,上述方法也不会产生准确的结果,例如,这幅图像:,这是阈值图像:不要期待奇迹,但使用更大的过滤器(不要满足于一次尝试)。还可以查看其他分段方法。请搜索现有的问题和答案。我感觉像是一天两次检测到一张纸被带到这里。@Pigger我所写的所有上述代码都来自以前的答案,尽管正如我所提到的,这些答案对某些图像不适用,例如:I.imgur.com/e6tVjaR.png。我只是要求做一些额外的处理。谢谢