|
|
|
|
import os
|
|
|
|
|
import cv2
|
|
|
|
|
import numpy as np
|
|
|
|
|
import sys
|
|
|
|
|
def robs():
|
|
|
|
|
cap = cv2.VideoCapture(0)
|
|
|
|
|
ok, src = cap.read()
|
|
|
|
|
cap.release()
|
|
|
|
|
|
|
|
|
|
if ok:
|
|
|
|
|
img = src
|
|
|
|
|
|
|
|
|
|
# 1. 灰度化处理图像
|
|
|
|
|
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
|
|
|
# 2. Roberts算子
|
|
|
|
|
kernelx = np.array([[-1, 0], [0, 1]], dtype=int)
|
|
|
|
|
kernely = np.array([[0, -1], [1, 0]], dtype=int)
|
|
|
|
|
# 3. 卷积操作
|
|
|
|
|
x = cv2.filter2D(grayImage, cv2.CV_16S, kernelx)
|
|
|
|
|
y = cv2.filter2D(grayImage, cv2.CV_16S, kernely)
|
|
|
|
|
# 4. 数据格式转换
|
|
|
|
|
absX = cv2.convertScaleAbs(x)
|
|
|
|
|
absY = cv2.convertScaleAbs(y)
|
|
|
|
|
Roberts = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
|
|
|
|
|
|
|
|
|
|
print(src.shape)
|
|
|
|
|
#单通道转为三通道
|
|
|
|
|
Roberts=cv2.cvtColor(Roberts, cv2.COLOR_GRAY2RGB)
|
|
|
|
|
|
|
|
|
|
img = np.hstack([src, Roberts])
|
|
|
|
|
cv2.imshow("(roberts)resourse and result", img)
|
|
|
|
|
# 等待关闭
|
|
|
|
|
cv2.waitKey(0)
|
|
|
|
|
def sob():
|
|
|
|
|
cap = cv2.VideoCapture(0)
|
|
|
|
|
ok, src = cap.read()
|
|
|
|
|
cap.release()
|
|
|
|
|
if ok:
|
|
|
|
|
img = src
|
|
|
|
|
########## Begin ##########
|
|
|
|
|
# 1. 灰度化处理图像
|
|
|
|
|
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
|
|
|
# 2. 求Sobel 算子
|
|
|
|
|
x = cv2.Sobel(grayImage, cv2.CV_16S, 1, 0) # 对x求一阶导
|
|
|
|
|
y = cv2.Sobel(grayImage, cv2.CV_16S, 0, 1) # 对y求一阶导
|
|
|
|
|
absX = cv2.convertScaleAbs(x)
|
|
|
|
|
absY = cv2.convertScaleAbs(y)
|
|
|
|
|
Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
|
|
|
|
|
########## End ##########
|
|
|
|
|
Sobel = cv2.cvtColor(Sobel, cv2.COLOR_GRAY2RGB)
|
|
|
|
|
img = np.hstack([src, Sobel])
|
|
|
|
|
cv2.imshow("resourse and result", img)
|
|
|
|
|
# 等待关闭
|
|
|
|
|
cv2.waitKey(0)
|
|
|
|
|
def lap():
|
|
|
|
|
cap = cv2.VideoCapture(0)
|
|
|
|
|
ok, src = cap.read()
|
|
|
|
|
cap.release()
|
|
|
|
|
if ok:
|
|
|
|
|
img = src
|
|
|
|
|
########## Begin ##########
|
|
|
|
|
# 1. 灰度化处理图像
|
|
|
|
|
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
|
|
|
# 2. 高斯滤波
|
|
|
|
|
grayImage= cv2.GaussianBlur(grayImage, (5, 5), 0)
|
|
|
|
|
# 3. 拉普拉斯算法
|
|
|
|
|
dst = cv2.Laplacian(grayImage, cv2.CV_16S, ksize=3)
|
|
|
|
|
# 4. 数据格式转换
|
|
|
|
|
Laplacian = cv2.convertScaleAbs(dst)
|
|
|
|
|
|
|
|
|
|
Laplacian = cv2.cvtColor(Laplacian, cv2.COLOR_GRAY2RGB)
|
|
|
|
|
########## End ##########
|
|
|
|
|
img = np.hstack([src, Laplacian])
|
|
|
|
|
cv2.imshow("resourse and result", img)
|
|
|
|
|
# 等待关闭
|
|
|
|
|
cv2.waitKey(0)
|
|
|
|
|
def _log():
|
|
|
|
|
cap = cv2.VideoCapture(0)
|
|
|
|
|
ok, src = cap.read()
|
|
|
|
|
cap.release()
|
|
|
|
|
if ok:
|
|
|
|
|
img = src
|
|
|
|
|
########## Begin ##########
|
|
|
|
|
# 1. 灰度转换
|
|
|
|
|
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
|
|
|
|
# 2. 边缘扩充处理图像并使用高斯滤波处理该图像
|
|
|
|
|
image = cv2.copyMakeBorder(img,2,2,2,2,borderType=cv2.BORDER_REPLICATE)
|
|
|
|
|
image = cv2.copyMakeBorder(img,2,2,2,2,borderType=cv2.BORDER_REPLICATE)
|
|
|
|
|
image = cv2.GaussianBlur(image,(3,3),0)
|
|
|
|
|
# 3. 使用Numpy定义LoG算子
|
|
|
|
|
m1=np.array([[0,0,-1,0,0],[0,-1,-2,-1,0],[-1,-2,16,-2,-1],[0,-1,-2,-1,0],[0,0,-1,0,0]])
|
|
|
|
|
image1=np.zeros(image.shape,dtype='float')
|
|
|
|
|
# 4. 卷积运算
|
|
|
|
|
# 为了使卷积对每个像素都进行运算,原图像的边缘像素要对准模板的中心。
|
|
|
|
|
# 由于图像边缘扩大了2像素,因此要从位置2到行(列)-2
|
|
|
|
|
for i in range(2,image.shape[0]-2):
|
|
|
|
|
for j in range(2,image.shape[1]-2):
|
|
|
|
|
image1[i,j]=np.sum(m1*image[i-2:i+3,j-2:j+3,1])
|
|
|
|
|
# 5. 数据格式转换
|
|
|
|
|
image1 = cv2.convertScaleAbs(image1)
|
|
|
|
|
|
|
|
|
|
image1 = cv2.resize(image1, (img.shape[1], img.shape[0]))
|
|
|
|
|
|
|
|
|
|
img = np.hstack([src, image1])
|
|
|
|
|
cv2.imshow("resourse and result", img)
|
|
|
|
|
# 等待关闭
|
|
|
|
|
cv2.waitKey(0)
|
|
|
|
|
def main():
|
|
|
|
|
print("1.Roberts算子 2.Sobel算子 3.Laplacian算子 4.log边缘算子")
|
|
|
|
|
myinput = input()
|
|
|
|
|
if myinput == '1':
|
|
|
|
|
robs()
|
|
|
|
|
elif myinput == '2':
|
|
|
|
|
sob()
|
|
|
|
|
elif myinput == '3':
|
|
|
|
|
lap()
|
|
|
|
|
elif myinput == '4':
|
|
|
|
|
_log()
|
|
|
|
|
else:
|
|
|
|
|
print("wrong input!")
|
|
|
|
|
|