亚像素的一种实现方案及开闭操作实现高精度canny边缘检测

  • 亚像素处理

图像处理过程中,提高检测方法的精度一般有两种方式:一种是提高图像系统的光学放大倍数和CCD相机的分辨率能力;另一种是引入亚像素细分技术来弥补硬件的不足以提高图像系统的分辨率。

如使用亚像素细分技术将精度提到到0.01像素,就相当于提高了100倍的图像系统分辨率。

但本文章并没有用插值方法进行操作,对像素之间进行划分,而是采取了numpy包中的resize函数,实现对图像像素点的放大,之后再进行相应的处理,最后的数据处于相应的倍数,以此来达到精度的要求。

scale_percent = 10
width = frame.shape[1] * scale_percent
height = frame.shape[0] * scale_percent
dim = (width, height)
frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)   # 改变像素尺寸

scale_percent为放大倍数,这里设置了十倍的放大系数。

  • 开闭操作

开操作:是图像的轮廓变得光滑,断开的较窄的狭颈和消除细的突出物,使结构元B对集合A进行开操作,定义为:

A○B=(A⊖B)⊕B

含义:先用B对A进行腐蚀,然后用B对结果进行膨胀。 

闭操作:同样使图像轮廓变得光滑,但与开操作相反,他能弥合狭窄的间断和细小的沟壑,消除小的空洞,并填补轮廓线中的裂痕,使用结构元B对集合A进行闭操作,定义为:

A∙B=(A⊕B)⊖B

具体可参考这篇博客:图像处理开闭操作(17) - 柳帅 - 博客园

代码实现

frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 图像二值化

ret, frame = cv2.threshold(frame, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9)) 
# 开操作
frame = cv2.morphologyEx(frame, cv2.MORPH_OPEN, kernel, iterations=5)
# 闭操作
frame = cv2.morphologyEx(frame, cv2.MORPH_CLOSE, kernel, iterations=5)

开操作可实现白色块变多,闭操作可实现黑色块变多。

高斯滤波

具体可参考这篇博客:图像平滑去噪之高斯滤波器 - KenSporger - 博客园

全部代码:

# !/usr/bin/env python
# _*_ coding: utf-8 _*_

import cv2

def main():
    frame = cv2.imread('Pic1_3.bmp')
    # print(frame.shape)

    frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 图像二值化

    ret, frame = cv2.threshold(frame, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)

    '''开闭操作'''
    kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (9, 9))
    # 开操作
    frame = cv2.morphologyEx(frame, cv2.MORPH_OPEN, kernel, iterations=5)
    # 闭操作
    frame = cv2.morphologyEx(frame, cv2.MORPH_CLOSE, kernel, iterations=1)

    cv2.namedWindow('cvtColor', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('cvtColor', 800, 600)
    cv2.imshow('cvtColor', frame)

    '''改变尺寸'''
    scale_percent = 10
    width = frame.shape[1] * scale_percent
    height = frame.shape[0] * scale_percent
    dim = (width, height)
    frame = cv2.resize(frame, dim, interpolation=cv2.INTER_AREA)   # 改变像素尺寸

    frame = cv2.GaussianBlur(frame, (17, 17), 0)  # 图像去噪

    edge_output = cv2.Canny(frame, 50, 150)  # 获取轮廓

    x = []
    y = []
    contours, heriachy = cv2.findContours(edge_output, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)    # contours将所有轮廓值放进一个列表内

    '''获取边缘点数据'''
    for contour in contours:
        for i in contour:
            x_s = i[0][0] / 10
            # print(x_s)
            y_s = i[0][1] / 10
            x.append(x_s)
            y.append(y_s)

    cv2.namedWindow('input image', cv2.WINDOW_NORMAL)
    cv2.resizeWindow('input image', 800, 600)
    cv2.imshow('input image', edge_output)

    cv2.waitKey(0)
    cv2.destroyAllWindows()

if __name__ == '__main__':
    main()

开闭操作后:

十倍放大的边缘图:

 

 虽然点看起来很稀疏,但是除于十后还是和密的。

如果大佬有更好的方案可以一起交流一下。

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘私坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值