版权声明:本文为博客园博主「三年一梦」的原创文章,遵循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')