边缘检测的基本原理与图
import cv2
import numpy as np
def task1():
filename = '/data/workspace/myshixun/task1/CRH.png'
########## Begin ##########
# 1. 灰度模式读取图像,图像名为CRH
CRH = cv2.imread(filename,0)
# 2. 计算图像梯度。首先要对读取的图像进行数据变换,因为使用了
# numpy对梯度进行数值计算,所以要使用
# CRH.astype('float')进行数据格式变换。
CRH = CRH.astype('float')
row, column = CRH.shape
gradient = np.zeros((row, column))
# 根据所讲的计算公式求梯度
for x in range(row - 1):
for y in range(column - 1):
gx = abs(CRH[x + 1, y] - CRH[x, y])
gy = abs(CRH[x, y + 1] - CRH[x, y])
gradient[x, y] = gx + gy
# 3. 对图像进行增强,增强后的图像变量名为sharp
sharp = CRH + gradient
########## End ##########
sharp = np.where(sharp > 255, 255, sharp)
sharp = np.where(sharp < 0, 0, sharp)
# 数据类型变换
gradient = gradient.astype('uint8')
sharp = sharp.astype('uint8')
# 保存图像
filepath = '/data/workspace/myshixun/task1/'
cv2.imwrite(filepath + 'out/gradient.png', gradient)
Roberts 算子
# -*- coding: utf-8 -*-
import cv2
import numpy as np
def robs():
filepath = '/data/workspace/myshixun/task2/'
# 读取图像
img = cv2.imread(filepath+'road.png')
########## Begin ##########
# 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)
########## End ##########
# 保存图像
cv2.imwrite(filepath+"out/roberts.png",Roberts)
Prewitt 算子与 Sobel 算子
```bash
# -*- coding: utf-8 -*-
import cv2
import numpy as np
def sob():
filepath = '/data/workspace/myshixun/task3/'
# 读取图像
img = cv2.imread(filepath+'road.png')
########## 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求一阶导
# 3. 数据格式转换
absX = cv2.convertScaleAbs(x)
absY = cv2.convertScaleAbs(y)
# 4. 组合图像
Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
########## End ##########
# 保存图像
cv2.imwrite(filepath+"out/sobel.png",Sobel)
**Laplacian 算子**
```bash
# -*- coding: utf-8 -*-
import cv2
def lap():
filepath = '/data/workspace/myshixun/task4/'
# 读取图像
img = cv2.imread(filepath+'shanfeng.png')
########## Begin ##########
# 1. 灰度化处理图像
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 2. 高斯滤波
grayImage = cv2.GaussianBlur(grayImage, (5, 5), 0, 0)
# 3. 拉普拉斯算法
dst = cv2.Laplacian(grayImage, cv2.CV_16S, ksize=3)
# 4. 数据格式转换
Laplacian = cv2.convertScaleAbs(dst)
########## End ##########
# 保存图像
cv2.imwrite(filepath + "out/laplacian.png",Laplacian)
LoG 边缘算子
import numpy as np
import cv2
def _log():
filepath = '/data/workspace/myshixun/task5/'
# 读取图像
img = cv2.imread(filepath + 'shanfeng.png')
########## Begin ##########
# 1. 灰度转换
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
# 2. 边缘扩充处理图像并使用高斯滤波处理该图像
image = cv2.copyMakeBorder(img, 2, 2, 2, 2, borderType=cv2.BORDER_REPLICATE)
image = cv2.GaussianBlur(image, (3, 3), 0, 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]])
# 4. 卷积运算
rows = image.shape[0]
cols = image.shape[1]
image1 = np.zeros(image.shape)
# 为了使卷积对每个像素都进行运算,原图像的边缘像素要对准模板的中心。
# 由于图像边缘扩大了2像素,因此要从位置2到行(列)-2
for k in range(0, 2):
for i in range(2, rows - 2):
for j in range(2, cols - 2):
image1[i, j] = np.sum((m1 * image[i - 2:i + 3, j - 2:j + 3, k]))
# 5. 数据格式转换
image1 = cv2.convertScaleAbs(image1)
########## End ##########
cv2.imwrite(filepath + "out/log.png", image1)
Canny 边缘检测
import cv2
# Canny算子
def cny():
filepath = '/data/workspace/myshixun/task6/'
# 读取图像
src = cv2.imread(filepath+'road.png')
########## Begin ##########
# 1. 高斯滤波
blur = cv2.GaussianBlur(src, (3, 3), 0)
# 2. 灰度转换
image = cv2.cvtColor(blur, cv2.COLOR_BGR2GRAY)
# 3. 求x,y方向的Sobel算子
gradx = cv2.Sobel(image, cv2.CV_16SC1, 1, 0)
grady = cv2.Sobel(image, cv2.CV_16SC1, 0, 1)
# 4. 使用Canny函数处理图像,x,y分别是3求出来的梯度,低阈值50,高阈值150
edge_output = cv2.Canny(gradx, grady, 50, 150)
########## End ##########
cv2.imwrite(filepath + "out/canny.png", edge_output)