图像基础、OpenCV入门4——图像边缘算法

来源:互联网 发布:银行存款怎样划算知乎 编辑:程序博客网 时间:2024/06/08 14:24

欧氏距离算法

将当前像素与邻接的下部和右部的像素进行比较,如果相似,则将当前像素设置为白色,否则设置为黑色。
判定像素是否相似,使用欧氏距离算法,将一个像素的三个色彩分量映射在三维空间中,如果2个像素点的欧氏距离小于某个常数的阈值,就认为它们相似。

代码

# -*- coding: utf-8 -*-import cv2import numpy as npfn = 'test1.jpg'def get_EuclideanDistance(x,y):    myx = np.array(x)    myy = np.array(y)    return np.sqrt(np.sum((myx-myy)*(myx-myy)))if __name__ == '__main__':    print('loading %s ...' % fn)    print ('working',)    myimg1 = cv2.imread(fn)    w = myimg1.shape[1]    h = myimg1.shape[0]    sz1 = w    sz0 = h    # 创建空白图像    myimg2 = np.zeros((sz0, sz1, 3), np.uint8)    # 对比产生线条    black = np.array([0,0,0])    white = np.array([255,255,255])    centercolor = np.array([125,125,125])    for y in range(0,sz0 - 1):        for x in range(0,sz1 - 1):            mydown = myimg1[y+1,x,:]            myright = myimg1[y,x+1,:]            myhere = myimg1[y,x,:]            lmyhere = myhere            lmyright = myright            lmydown = mydown            if get_EuclideanDistance(lmyhere, lmydown) >16 and get_EuclideanDistance(lmyhere,lmyright)>16:                myimg2[y,x,:] = black            elif get_EuclideanDistance(lmyhere,lmydown) <=16 and get_EuclideanDistance(lmyhere,lmyright)<=16:                myimg2[y,x,:] = white            else:                myimg1[y,x,:]=centercolor            print ('.',)    cv2.namedWindow('img2')    cv2.imshow('img2',myimg2)    cv2.waitKey()    cv2.destrdestroyAllWindows()

原图:
这里写图片描述

结果
这里写图片描述


Laplacian

Laplacian 算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度grad的散度div。可使用运算模板来运算这定理定律。

Laplacian 算子对噪声比较敏感,所以图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把Laplacian 算子和平滑算子结合起来生成一个新的模板。

——百度百科

Python的Laplacian函数进行边缘检测:

cv2.Laplacian(src,ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]]) -> dst

示例程序

# -*- coding: utf-8 -*-# coding=utf-8# 线性锐化滤波,拉普拉斯图像变换import cv2import numpy as np fn = "test.jpg"myimg = cv2.imread(fn)img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY)img_small=cv2.resize(img,(500,300),interpolation=cv2.INTER_CUBIC)jpimg = cv2.Laplacian(img_small, -1)cv2.imshow('src',img_small)cv2.imshow('dst',jpimg)cv2.waitKey()cv2.destroyAllWindows()

这里写图片描述

这里写图片描述


sobel 非线性滤波

sobel非线性滤波采用梯度模的近似方式提取边缘,锐化图像。

# -*- coding: utf-8 -*-# coding=utf-8# 线性锐化滤波,拉普拉斯图像变换import cv2import numpy as np fn = "test.jpg"myimg = cv2.imread(fn)img=cv2.cvtColor(myimg,cv2.COLOR_BGR2GRAY)img_small=cv2.resize(img,(500,300),interpolation=cv2.INTER_CUBIC)jpimg = cv2.Sobel(img_small, 0, 1, 1,)cv2.imshow('src',img_small)cv2.imshow('dst',jpimg)cv2.waitKey()cv2.destroyAllWindows()

这里写图片描述

如果将结果进行反转处理,可得到更好地效果。

原创粉丝点击