将当前像素与邻接的下部和右部的像素进行比较,如果相似,则将当前像素设置为白色,否则设置为黑色。
判定像素是否相似,使用欧氏距离算法,将一个像素的三个色彩分量映射在三维空间中,如果2个像素点的欧氏距离小于某个常数的阈值,就认为它们相似。
代码
# -*- coding: utf-8 -*-
import cv2
import numpy as np
fn = '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 算子是n维欧几里德空间中的一个二阶微分算子,定义为梯度grad的散度div。可使用运算模板来运算这定理定律。
Laplacian 算子对噪声比较敏感,所以图像一般先经过平滑处理,因为平滑处理也是用模板进行的,所以,通常的分割算法都是把Laplacian 算子和平滑算子结合起来生成一个新的模板。
——百度百科
Python的Laplacian函数进行边缘检测:
cv2.Laplacian(src,ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]]) -> dst
示例程序
# -*- coding: utf-8 -*-
# coding=utf-8
# 线性锐化滤波,拉普拉斯图像变换
import cv2
import 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非线性滤波采用梯度模的近似方式提取边缘,锐化图像。
# -*- coding: utf-8 -*-
# coding=utf-8
# 线性锐化滤波,拉普拉斯图像变换
import cv2
import 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()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zLUhJywZ-1574725781388)(https://img-blog.csdn.net/20171019084426632?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVuZGg=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)]
如果将结果进行反转处理,可得到更好地效果。