赞
踩
版权声明:本文为博客园博主「三年一梦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https
https://www.cnblogs.com/king-lps/p/8007134.html
import matplotlib.pyplot as plt
import numpy as np
import math
import cv2
from PIL import Image
img=cv2.imread("C:/Users/S5/Desktop/PIC/case1/mohu1.png",cv2.IMREAD_GRAYSCALE)
r=cv2.Canny(img,50,80)
cv2.imshow('orignal',img)
cv2.imshow("result",r)
cv2.waitKey()
cv2.destroyAllWindows()
saveFile = "C:/Users/S5/Desktop/PIC/jieguo.jpg"
cv2.imwrite(saveFile,r)
import matplotlib.pyplot as plt import numpy as np import math import cv2 img=plt.imread("C:/Users/S5/Desktop/PIC/case1/mohu1.png") sigma1 = sigma2 = 1 sum = 0 gaussian = np.zeros([5, 5]) for i in range(5): for j in range(5): gaussian[i,j] = math.exp(-1/2 * (np.square(i-3)/np.square(sigma1) #生成二维高斯分布矩阵 + (np.square(j-3)/np.square(sigma2)))) / (2*math.pi*sigma1*sigma2) sum = sum + gaussian[i, j] gaussian = gaussian/sum print(gaussian) def rgb2gray(rgb): return np.dot(rgb[...,:3], [0.299, 0.587, 0.114]) gray = rgb2gray(img) W, H = gray.shape new_gray = np.zeros([W-5, H-5]) for i in range(W-5): for j in range(H-5): new_gray[i,j] = np.sum(gray[i:i+5,j:j+5]*gaussian) plt.imshow(new_gray, cmap="gray") W1, H1 = new_gray.shape dx = np.zeros([W1-1, H1-1]) dy = np.zeros([W1-1, H1-1]) d = np.zeros([W1-1, H1-1]) for i in range(W1-1): for j in range(H1-1): dx[i,j] = new_gray[i, j+1] - new_gray[i, j] dy[i,j] = new_gray[i+1, j] - new_gray[i, j] d[i, j] = np.sqrt(np.square(dx[i,j]) + np.square(dy[i,j])) plt.imshow(d, cmap="gray") W2, H2 = d.shape NMS = np.copy(d) NMS[0,:] = NMS[W2-1,:] = NMS[:,0] = NMS[:, H2-1] = 0 for i in range(1, W2-1): for j in range(1, H2-1): if d[i, j] == 0: NMS[i, j] = 0 else: gradX = dx[i, j] gradY = dy[i, j] gradTemp = d[i, j] # 如果Y方向幅度值较大 if np.abs(gradY) > np.abs(gradX): weight = np.abs(gradX) / np.abs(gradY) grad2 = d[i-1, j] grad4 = d[i+1, j] # 如果x,y方向梯度符号相同 if gradX * gradY > 0: grad1 = d[i-1, j-1] grad3 = d[i+1, j+1] # 如果x,y方向梯度符号相反 else: grad1 = d[i-1, j+1] grad3 = d[i+1, j-1] # 如果X方向幅度值较大 else: weight = np.abs(gradY) / np.abs(gradX) grad2 = d[i, j-1] grad4 = d[i, j+1] # 如果x,y方向梯度符号相同 if gradX * gradY > 0: grad1 = d[i+1, j-1] grad3 = d[i-1, j+1] # 如果x,y方向梯度符号相反 else: grad1 = d[i-1, j-1] grad3 = d[i+1, j+1] gradTemp1 = weight * grad1 + (1-weight) * grad2 gradTemp2 = weight * grad3 + (1-weight) * grad4 if gradTemp >= gradTemp1 and gradTemp >= gradTemp2: NMS[i, j] = gradTemp else: NMS[i, j] = 0 plt.imshow(NMS, cmap = "gray") W3, H3 = NMS.shape DT = np.zeros([W3, H3]) TL = 0.65 * np.max(NMS) TH = 0.8 * np.max(NMS) for i in range(1, W3-1): for j in range(1, H3-1): if (NMS[i, j] < TL): DT[i, j] = 0 elif (NMS[i, j] > TH): DT[i, j] = 1 elif ((NMS[i-1, j-1:j+1] < TH).any() or (NMS[i+1, j-1:j+1]).any() or (NMS[i, [j-1, j+1]] < TH).any()): DT[i, j] = 1 plt.imshow(DT, cmap = "gray") cv2.imwrite("C:/Users/S5/Desktop/PIC/canny.jpg",DT)
import matplotlib.pyplot as plt import numpy as np import math import cv2 img = cv2.imread('C:/Users/S5/Desktop/PIC/case1/mohu1.png',cv2.IMREAD_GRAYSCALE) cv2.imshow("img",img) cv2.waitKey() cv2.destroyAllWindows() #定义一个显示函数 def cv_show(img,name): cv2.imshow(name,img) cv2.waitKey() cv2.destroyAllWindows() #取横向轮廓 sobelx = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=3) sobelx = cv2.convertScaleAbs(sobelx) cv_show(sobelx,'sobelx') #取纵向轮廓 sobely = cv2.Sobel(img,cv2.CV_64F,0,1,ksize=3) sobely = cv2.convertScaleAbs(sobely) cv_show(sobely,'sobely') #横纵轮廓叠加 sobelxy = cv2.addWeighted(sobelx,0.5,sobely,0.5,0) cv_show(sobelxy,'sobelxy')
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。