美文网首页
图像识别学习

图像识别学习

作者: sidyph | 来源:发表于2018-11-15 21:44 被阅读0次

    一、原始图片分类:
    单通道:灰度图片,0-255
    三通道:带彩色的图片:如RGB,红绿蓝,每个颜色都有0-255
    四通道:RGB带Alpha通道
    img = cv2.imread("D:\cat.jpg") #读取图像
    cv2.namedWindow("Image") #创建窗口
    cv2.imshow("Image", img) #显示窗口
    cv2.waitKey (0)#停止在当前窗口,否则一闪而过
    cv2.destroyAllWindows()#撤销窗口

    二、原始图片经过opencv处理后变为0-1矩阵形式:
    0010001
    1010010
    0000100
    其中又分为以下几步:
    1.将三通道/四通道图片转为单通道图片,即灰度图片

    2.将灰度图片二值化(即01化),关键概念:阈值,低于阈值的为0,即黑色,高于阈值的为1,为白色
    3.有的时候还需要做反向处理:
    如将:
    11111111111
    1100000001
    11111111111
    转化为:
    0000000000
    00111111110
    0000000000

    三、二值化图片的基本处理算法:
    1.腐蚀
    腐蚀是对白色部分而言的,即矩阵中的1
    首先要有一个目标图片,例如


    test3.png

    然后有一个结构元素,这个结构元素有多种结构,例如3x3的矩阵、十字形、菱形,但是一定要指定一个中心。
    element = cv2.getStructuringElement(cv2.MORPH_CROSS,(5,5))#定义一个十字形结构元素
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT,(3, 3))#定义一个33的矩形结构元素
    表述一:结构元素和目标图片的白色部分进行求交,当结构元素包含于目标图片白色部分的时候,其指定中心即为腐蚀结果(白色/1)。如果结构元素不能包含于目标白色部分,则该部分为黑色/0.
    表述二:对于二值图像的每一个像素点(无论0还是1),我们将他与模板核的核心重叠,查看模板核中所有值为1的格点组成的图像是否被完全包含在那个二值图像中。如果是,则将该像素点更新为1,否则,更新为0。
    特别的,如果是一个白色图片的最外边缘,则仍为白色。
    eroded = cv2.erode(img,kernel)#腐蚀图像
    腐蚀后的图片:

    test3_out.png
    数学方法:
    假如结构元素是一个3
    3的矩阵:
    111
    111
    111
    用该矩阵去和目标图片中的白色部分求交,其中心和目标图片白色部分的某像素重叠,然后获取两者相交部分,目标图片白色部分的所有像素点值的集合,取其最小值,即为腐蚀后的值。

    2.膨胀:
    对于二值图像的每一个为1的像素点,我们将他与模板核的核心重叠,将所有模板核为1的位置下的目标图像对应位置像素改为1。所有的1求并集即为膨胀后的结果。
    dilated = cv2.dilate(img,kernel)#膨胀图像

    3.开运算:
    先腐蚀后膨胀
    先腐蚀,白色部分变小,后膨胀,白色部分再变大。
    开运算可以消除一些很小的背景(黑色背景)噪点(椒盐噪声),平滑较大物体的边界而不明显改变其体积。也会磨光矩形的内边缘,以及分离一些粘连目标。
    opened = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)#开运算

    4.闭运算:
    先膨胀后腐蚀
    先膨胀,白色部分变大,再腐蚀,白色部分变小。
    闭运算在去除图像的前景(白色部分)噪声方面具有很好的应用,通过闭运算之后,图像原有目标的间断可以得到连接、目标内部的孔洞可以得到填充而基本不改变原图的大小以及形态。同时也会磨光凸向图像内部的边角。
    closed = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)#闭运算

    思考:如何利用开闭运算获取水平线和垂直线?
    思路:对于非水平线和非垂直线,如色块,可以用大一点的结构元素去做开运算,得到的结果是去除了水平线和垂直线的色块(大小和开运算之前相同),然后用原始矩阵减去开运算后的矩阵,得到的就是纯水平线和纯垂直线。
    对于纯垂直线,可以用31的矩阵做开运算删除水平线,然后运算前和运算后相减,得到垂直线。
    对于纯水平线,可以用3
    1的矩阵做开运算删除垂直线,然后运算前和运算后相减,得到水平线。

    相关文章

      网友评论

          本文标题:图像识别学习

          本文链接:https://www.haomeiwen.com/subject/oueufqtx.html