一个缺陷检测数据集:德国的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)
主要可以提取到图像的边缘特征,包括横向的纵向的,以及两者结合的,对于边缘的提取以及裂纹的提取效果还算可以。
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计算,看能否直接圈出目标区域。