作者:谷智精源 | 来源:互联网 | 2023-10-12 16:28
图像处理过程中,提高检测方法的精度一般有两种方式:一种是提高图像系统的光学放大倍数和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 cv2def 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 = 10width = frame.shape[1] * scale_percentheight = frame.shape[0] * scale_percentdim = (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] / 10x.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()
开闭操作后:
十倍放大的边缘图:
虽然点看起来很稀疏,但是除于十后还是和密的。
如果大佬有更好的方案可以一起交流一下。