边缘检测

边缘检测的基本原理与图

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)
  • 17
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值