opencv对图像进行处理的方法

一个缺陷检测数据集:德国的DAGM2007
opencv中文网站(介绍详细,目录清晰,不多)

图像颜色空间变换:

图像在不同的颜色空间有可能会突出不同的特征,比如这里进行了RGB HSV GRAY YCRCB颜色空间的变换

img_BGR = cv2.imread(img_path) # BGR 
plt.imshow(img_BGR);plt.axis('off');plt.title('BGR')

img_RGB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2RGB)
plt.imshow(img_RGB);plt.axis('off');plt.title('RGB')

img_GRAY = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2GRAY)
plt.imshow(img_GRAY);plt.axis('off');plt.title('GRAY')

img_HSV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HSV)
plt.imshow(img_HSV);plt.axis('off');plt.title('HSV')

img_YcrCb = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YCrCb)
plt.imshow(img_YcrCb);plt.axis('off');plt.title('YcrCb')

img_HLS = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2HLS)
plt.imshow(img_HLS);plt.axis('off');plt.title('HLS')

img_XYZ = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2XYZ)
plt.imshow(img_XYZ);plt.axis('off');plt.title('XYZ')

img_LAB = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2LAB)
plt.imshow(img_LAB);plt.axis('off');plt.title('LAB')

img_YUV = cv2.cvtColor(img_BGR, cv2.COLOR_BGR2YUV)
plt.imshow(img_YUV);plt.axis('off');plt.title('YUV')

图像自适应阈值:

通过自适应阈值的选取可以实现类似滤波以及目标图像剥离的效果。
图像自适应阈值参考博客

图像的膨胀、腐蚀以及礼帽等形态学操作

形态学操作就是基于形状的一系列图像处理操作。通过将 结构元素 作用于输入图像来产生输出图像。

最基本的形态学操作有二:腐蚀与膨胀(Erosion 与 Dilation)。 他们的运用广泛:
消除噪声
分割(isolate)独立的图像元素,以及连接(join)相邻的元素。
寻找图像中的明显的极大值区域或极小值区域。

# 一个礼帽的代码,可同样实现边缘的提取
img = cv2.imread(img_path2,0)

#用numpy生成卷积核
kernel = np.ones((5,5),np.uint8)
tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel)

plt.imshow(tophat)

图像的梯度计算-拉普拉斯算子,sobel算子:

主要可以提取到图像的边缘特征,包括横向的纵向的,以及两者结合的,对于边缘的提取以及裂纹的提取效果还算可以。
def laplacian_demo(img):
    dst = cv.Laplacian(img, cv.CV_32F)
    kennel = np.array([[0, 1, 0], [1, -4, 1], [0, 1, 0]])
    dst = cv.filter2D(img, cv.CV_32F, kernel=kennel)
    lpls = cv.convertScaleAbs(dst)
    plt.imshow(lpls)

def laplacian_plus_demo(img):
    dst = cv.Laplacian(img, cv.CV_32F)
    kennel = np.array([[1, 1, 1], [1, -8, 1], [1, 1, 1]])
    dst = cv.filter2D(img, cv.CV_32F, kernel=kennel)
    lpls = cv.convertScaleAbs(dst)
    plt.imshow(lpls)

def sobel_demo(img):
    kennel_x = np.array([[-1, 0, 1], [-2, 0 ,2], [-1, 0, 1]])
    kennel_y = np.array([[-1, -2, -1], [0, 0, 0], [1, 2, 1]])
    grad_x = cv.filter2D(img, cv.CV_32F, kernel=kennel_x)
    grad_y = cv.filter2D(img, cv.CV_32F, kernel=kennel_y)
    gradx = cv.convertScaleAbs(grad_x)
    grady = cv.convertScaleAbs(grad_y)
    #plt.imshow(gradx)
    #plt.imshow(grady)
    gradxy = cv.addWeighted(gradx, 0.5, grady, 0.5, 0)
    plt.imshow(gradxy)

def scharr_demo(img):
    kennel_x = np.array([[-3, 0, 3], [-10, 0 ,10], [-3, 0, 3]])
    kennel_y = np.array([[-3, -10, -3], [0, 0, 0], [3, 10, 3]])
    grad_x = cv.filter2D(img, cv.CV_32F, kernel=kennel_x)
    grad_y = cv.filter2D(img, cv.CV_32F, kernel=kennel_y)
    gradx = cv.convertScaleAbs(grad_x)
    grady = cv.convertScaleAbs(grad_y)
    #plt.imshow(gradx)
    #plt.imshow(grady)
    gradxy = cv.addWeighted(gradx, 0.5, grady, 0.5, 0)
    plt.imshow(gradxy)

图像的频域滤波和傅里叶变换:

图像也可以进行二维的频域转换等,可以实现高低频的滤波,一般来说细节总是存在于高频信号中的,就像是之前做的小波变换一样。
参考资料

图像分割算法:

各类分割算法总结

分割/提取 图像中的目标区域 (可根据此关键词进行搜索)

总结:

根据这些传统的算法,可以得到一些有用的图像边缘信息,这些信息也是有用的,可能会对模型有大的帮助,但是后续如何用还要继续深入了解,目前的想法,把sobel算子滤波后的图像进行yolo计算,看能否直接圈出目标区域。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值