opencv读取图片的默认像素排列是BGR,和很多其他软件不一致 。
注意!!只能是进行灰度处理的图片才可以进行如下操作,彩色图片由于是RGB,所以会出现一些莫名其妙的状况
由于一些情况图片会有许多噪点,这时候可以使用滤波来解决 括号里的(5,5)为卷积核的大小。
# 均值滤波 blur = cv2.blur(img, (5, 5)) # cv2.imshow("blur", blur) # 方框滤波 和均值滤波相似 # normalize 选择是否归一化,则超过最大值 ,则为最大值 box = cv2.boxFilter(img, -1, (5, 5), normalize=True) # cv2.imshow("box", box) # 高斯滤波,定义范围内权重矩阵进行计算,卷积核内的数值满足高斯分布,以最靠中间 # 的值更重视 gaussian = cv2.GaussianBlur(img, (5, 5), 1) # cv2.imshow("gaussian", gaussian) # 中值滤波 取范围内排列整齐的中间值 median = cv2.medianBlur(img, 5) # cv2.imshow("median", median)腐蚀操作会把大小内不相同的色值给腐蚀掉,而膨胀则反之
# 腐蚀操作 # 先给他定义卷积核的大小,以uint8格式,因为色值的取值为0-255,所以uint8 # 就足够了 kernel = np.ones((3, 3), np.uint8) # dst为图片路径,kernel为定义的大小,iterations为腐蚀的次数。 erosion = cv2.erode(dst, kernel, iterations=1) # cv2.imshow("erosion", erosion) # 膨胀操作 # dst为图片路径,kernel为定义的大小,iterations为膨胀的次数。 dilate = cv2.dilate(erosion3, kernel, iterations=1) # cv2.imshow("dilate", dilate) # 开运算 先腐蚀再膨胀 open = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) # 闭运算 先膨胀再腐蚀 close = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) open_close = np.hstack((open, close)) # 梯度运算 膨胀-腐蚀 gradient = cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel) # cv2.imshow("gradient", gradient) # 礼帽 原始输入减去开运算 tophat = cv2.morphologyEx(img, cv2.MORPH_TOPHAT, kernel) # 黑帽 闭运算减去原始输入 blackhat = cv2.morphologyEx(img, cv2.MORPH_BLACKHAT, kernel) hat = np.hstack((tophat, blackhat)) # cv2.imshow("hat", hat) # 梯度算法 # Sobel算子 # # -1 0 +1 -1 -2 -1 # Gx = -2 0 +2 Gy = 0 0 0 # -1 0 +1 +1 +2 +1 # 类似高斯 离得越远 权重越低 # 梯度计算 中间值为 平行从右到左,垂直从下到上 相加 # 文件 深度 水平 垂直 Sobel算子大小 sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3) # Sobel因子相加合并,处理效果会更好, 不建议直接添加,效果并不是太好 addxy = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0) # 转为绝对值, 因为黑到白进行梯度计算的时候会出现负数 将会被opencv截断,所以需要取绝对值 sobel = cv2.convertScaleAbs(addxy) cv2.imshow("sobel", sobel) # Scharr算子 # # -3 0 +3 -3 -10 -3 # Gx = -10 0 +10 Gy = 0 0 0 # -3 0 +3 +3 +10 +3 # 类似高斯 离得越远 权重越低 # 梯度计算 中间值为 平行从右到左,垂直从下到上 相加 # 因为数值更大,比Sobel算子的效果更加明显 Scharrx = cv2.Scharr(img, cv2.CV_64F, 1, 0) Scharry = cv2.Scharr(img, cv2.CV_64F, 0, 1) # Scharr因子相加合并,处理效果会更好, 不建议直接添加,效果并不是太好 addScharrxy = cv2.addWeighted(Scharrx, 0.5, Scharry, 0.5, 0) # 转为绝对值, 因为黑到白进行梯度计算的时候会出现负数 将会被opencv截断,所以需要取绝对值 Scharr = cv2.convertScaleAbs(addScharrxy) cv2.imshow("Scharr", Scharr) # Laplacian算子 # # 0 1 0 # G = 1 -4 1 # 0 1 0 # 类似高斯 离得越远 权重越低 # 因为是靠中间值,所以对于一些噪点处理效果不好 # 由于是进行中间值比较 所以没有垂直与平行的概念 Laplacian = cv2.Laplacian(img, cv2.CV_64F, ksize=3) # 转为绝对值, 因为黑到白进行梯度计算的时候会出现负数 将会被opencv截断,所以需要取绝对值 Laplacian = cv2.convertScaleAbs(Laplacian) cv2.imshow("Laplacian", Laplacian)