首页 > 其他分享 >opencv水平线与垂直线清除(表格线清除)

opencv水平线与垂直线清除(表格线清除)

时间:2024-01-27 21:22:23浏览次数:28  
标签:清除 垂直线 cv2 opencv 腐蚀 cnts result 图像 255

 1.腐蚀(Erosing)

  腐蚀是一种常见的形态学操作,它通过将图像中的物体边界向内部腐蚀来减小物体的大小。腐蚀操作通常用于去除图像中的小白噪声、分离物体等。在腐蚀操作中,我们需要定义一个结构元素(通常是一个小的矩形或圆形),然后将这个结构元素在图像上滑动,当结构元素完全覆盖物体时,该像素点保持原值,否则置为0。这里原图如下图所示。

   现在选取一个核,我这里想要将白色竖线腐蚀掉,所以选取宽大于高的这种核运算,尽量保留白色横线。步骤如下:

  当腐蚀核(绿色框)运算时,紫色?处的值为核内最小的值,随意?处的值为0(黑色)。

 

   腐蚀核继续遍历像素值:

  继续遍历所有像素点,最后得到整个图经过核(宽=3,高=1)腐蚀后的图如下图所示:

 

2.膨胀(dilation)

  形态学操作膨胀其基本原理是将图像与结构元素进行卷积,计算结构元素覆盖下图像的最大像素值,并用这个最大值替换结构元素锚点位置的像素值。这样可以使图像中的高亮区域逐渐增长,实现“领域扩张”的效果。可以用于消除噪声、分割独立的图像元素、连接相邻的图像元素,以及寻找图像中明显的极大值区域等。在实际应用中,可以根据需要选择不同大小和形状的结构元素,以达到最佳的膨胀效果。

  膨胀是针对图像中的高亮部分(即白色部分)进行的,而不是黑色部分。因此,膨胀操作可以使图像中的高亮区域逐渐增长,但不会影响黑色区域的大小和形状。

  膨胀与腐蚀相反,如图(一个方格就是一个像素):对于该二值图(0代表黑色,255代表白色),只有黑色背景与白色前景。假设 有一个膨胀的核(图中绿色框),紫色为使用核膨胀后的元素,由于绿色框中最大值为0(黑色),所以该值膨胀后仍然为黑色(右图),以此遍历所有像素值就可以得到整个图被核(绿色框)膨胀后的图。

   最后整个图膨胀为下图所示。

 

2.开运算(Opening)

  开运算是形态学操作中的一种组合操作,它是先进行腐蚀操作,再进行膨胀操作。开运算的主要作用是去除图像中的噪声,平滑物体的边界,并且可以分离物体。开运算可以消除小的亮点(白噪声),并且可以将不同物体分开。在开运算中,首先对图像进行腐蚀操作,然后再对腐蚀后的图像进行膨胀操作。与其相反的是闭运算(先膨胀,再腐蚀),这里不讲解。

3.实现表格线的删除

  利用开运算就可以达到删除水平线或者垂直线,这里用电脑绘图自己绘制了一个简易的表格图

 删除水平线

import cv2
image = cv2.imread('opencv.png')
result = image.copy()
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]#自适应
cv2.imshow('binary_INV',thresh)#显示反转后二值图

# Remove horizontal lines
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (20,1))
remove_horizontal = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(remove_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(result, [c], -1, (255,255,255), 5)
cv2.imwrite('img_remove_horizontal_lines.png',result)#保存结果图片
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyWindow()

'''
cv2.THRESH_BINARY_INV:表示进行反转的二值化操作,即像素值高于阈值的区域将被设置为0(黑色),而像素值低于阈值的区域将被设置为指定的最大值(这里是255,即白色)。
cv2.THRESH_OTSU:表示使用Otsu方法自动计算阈值。Otsu方法是一种通过计算类间方差来确定图像二值化最佳阈值的方法。
cv2.threshold函数返回一个包含两个元素的元组,第一个元素是计算得到的阈值,第二个元素是二值化后的图像。
这里使用[1]来索引元组中的第二个元素,即二值化后的图像,并将其存储在thresh变量中。
cnts = cnts[0] if len(cnts) == 2 else cnts[1]是为了兼容OpenCV的不同版本。在OpenCV 3中,cv2.findContours 返回三个值:图像、轮廓和层次结构。而在OpenCV 4中,它只返回两个值:轮廓和层次结构。这行代码检查cv2.findContours的返回值数量,并据此提取轮廓列表。 

'''

  运行后,得到的二值图像与保存的删除水平线的图像如下:

  删除垂直线

import cv2
image = cv2.imread('opencv.png')
result = image.copy()
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]#自适应
cv2.imshow('binary_INV',thresh)#显示反转后二值图

# Remove vertical lines
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,20))
remove_vertical = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
cnts = cv2.findContours(remove_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    cv2.drawContours(result, [c], -1, (255,255,255), 5)

cv2.imwrite('img_remove_vertical_lines.png',result)#保存结果图片
cv2.imshow('result',result)
cv2.waitKey(0)
cv2.destroyWindow()

 

  小结:注意核的选取不一定是常见的3x3,可以根据自己的需要选取核的形状与大小。图像形态学操作除了本文介绍的膨胀、腐蚀、还有其他包括形态学梯度、礼帽运算等。本文可以还可以继续调节不同的核大小与形状继续观察效果,至于为什么上图中得到的线条是断断续续的,就留给读者自己思考与解决了。

 

  若存在不足或错误之处,欢迎指出与评论!

标签:清除,垂直线,cv2,opencv,腐蚀,cnts,result,图像,255
From: https://www.cnblogs.com/wancy/p/17953260

相关文章

  • itop-RK3588开发板机器视觉开发OpenCV-Python的安装
    由于 iTOP-RK3588 编译安卓和 Linux 源码使用的 ubuntu 版本为 ubuntu20.04,为了方便和统一,本手册的实验环境也为 Ubuntu20.04,如果使用的是其他版本的 ubuntu。可能会存在一些细微的区别,建议大家所使用的 ubuntu 版本和我们保持一致。使用以下命令安装 OpenCV-Python,安......
  • itop-RK3588开发板机器视觉开发OpenCV-Python的安装
    由于 iTOP-RK3588 编译安卓和 Linux 源码使用的 ubuntu 版本为 ubuntu20.04,为了方便和统一,本手册的实验环境也为 Ubuntu20.04,如果使用的是其他版本的 ubuntu。可能会存在一些细微的区别,建议大家所使用的 ubuntu 版本和我们保持一致。使用以下命令安装 OpenC......
  • 【快速阅读二】从OpenCv的代码中扣取泊松融合算子(Poisson Image Editing)并稍作优化
    泊松融合是一种非常不错多图融合算法,在OpenCv的相关版本中也包含了该算子模块,作者尝试着从OpenCv的大仓库中扣取出该算子的全部代码,并分享了一些在扣取代码中的心得和收获。泊松融合我自己写的第一版程序大概是2016年在某个小房间里折腾出来的,当时是用......
  • 【OpenCV】:浅析 OpenCV 中的图像数据结构 Mat
    以下内容主要来自OpenCV中的mat.hpp这个头文件关于MatMat是OpenCV中用来存储图像数据的基础数据结构,原话是Itcanbeusedtostorerealorcomplex-valuedvectorsandmatrices,grayscaleorcolorimages,voxelvolumes,vectorfields,pointclouds,tensors,......
  • C++ opencv计算两个cv::Rect的重复面积
    C++ opencv计算两个cv::Rect的重复面积  #include<opencv2/opencv.hpp>#include<iostream>intmain(){//创建两个矩形cv::Rectrect1(10,10,50,50);//(x,y,width,height)cv::Rectrect2(30,30,50,50);//检查两个矩形是否重叠......
  • SQL Server 清除一个数据库下所有表数据,保留表结构
    用法:在需要清空数据的数据库创建并执行存储过程,该存储过程并不会影响其他数据库❗请小心使用这些脚本,确保在生产环境之前备份您的数据库。⚠️存储过程:CREATEPROCEDUREClearAllTablesASBEGINDECLARE@TableNameNVARCHAR(255)DECLAREtableCursorCURSORFOR......
  • OpenCV仿射变换+投射变换+单应性矩阵
    OpenCV仿射变换+投射变换+单应性矩阵本来想用单应性求解小规模运动的物体的位移,但是后来发现即使是很微小的位移也会带来超级大的误差甚至错误求解,看起来这个方法各种行不通,还是要匹配知道深度了以后才能从三维仿射变换来入手了,纠结~estimateRigidTransform():计算多个二维......
  • ubuntu编译opencv:cmake时下载超时及找不到源的问题
    1ade下载超时查看CMakeDownlodLog.txt找下载地址和目标路径(包含md5值),按下载地址下载文件,放到你的opencv-4.7.0/.cache/ade下,记得把文件改名改成包含md5值的。其他缺失文件也可以一样处理。2即使下载完依然cmake报错--ConfiguringdoneCMakeErroratmodules/gapi/cmake/Do......
  • OpenCV安装与配置
    OpenCV安装与配置C++与OpenCV配置安装下载路径Releases-OpenCV添加Path环境变量的路径D:\OpenCV\opencv\build\x64\vc15\bin右击此电脑,选择属性,编辑环境变量设置的是dll文件的环境变量创建一个新的VisualStudioC++空项目尽量用英文路径测试代码#include<iostream......
  • 【快速阅读二】从OpenCv的代码中扣取泊松融合算子(Poisson Image Editing)并稍作优化
    泊松融合我自己写的第一版程序大概是2016年在某个小房间里折腾出来的,当时是用的迭代的方式,记得似乎效果不怎么样,没有达到论文的效果。前段时间又有网友问我有没有这方面的程序,我说Opencv已经有了,可以直接使用,他说opencv的框架太大,不想为了一个功能的需求而背上这么一座大山,看......