13.梯度scharr与lapkacia算子
拉普拉斯计算中间点和四周点的比较,不需要区分x轴或y轴
import cv2
from matplotlib import pyplot as plt#导入 Matplotlib 库中的 pyplot 模块,并命名为 plt。#Matplotlib 是一个强大的绘图库,常用于绘制图表和图像显示。#就是窗口# OpenCV BGR(Blue, Green, Red)# Matplotlib RGB(Red, Green, Blue)
import numpy as np #导入 NumPy 库,并命名为 np。#NumPy 提供了多维数组对象及各种派生对象(如掩模数组),并且包含大量用于数组快速操作的函数。# 如果图像不在脚本所在目录,请提供完整路径
img1_t = cv2.imread(r"D:/Professional software package(new)/VS Projects/OPenCv/Picture/IMG_20231230_171718.jpg")#使用 OpenCV 函数读取图像文件。
#img2_t= cv2.imread(r"D:/Professional software package(new)/VS Projects/OPenCv/Picture/IMG_20231230_145121.jpg") #它返回的是一个 NumPy 数组,其中包含了图像的像素数据。如果没有找到图像或路径错误,img 将是 None。
img3_t= cv2.imread(r"D:/Professional software package(new)/VS Projects/OPenCv/Picture/maoci1.jpg") #它返回的是一个 NumPy 数组,其中包含了图像的像素数据。如果没有找到图像或路径错误,img 将是 None。# 检查图片是否成功加载
if img1_t is None:print("Error: 图像1加载失败,请检查文件路径和文件权限。")
elif img3_t is None: print("Error: 图像2加载失败,请检查文件路径和文件权限。")
else:# 将 BGR 图像转换为 RGB 图像以供 matplotlib 正确显示print(" 图像加载成功!")img1_rgb = cv2.cvtColor(img1_t, cv2.COLOR_BGR2RGB)#由于 OpenCV 默认使用 BGR 格式来存储图像数据,而大多数其他图像处理工具(包括 Matplotlib)使用 RGB 格式。 #因此,在用 Matplotlib 显示图像之前,我们需要将图像从 BGR 格式转换为 RGB 格式。img3_rgb = cv2.cvtColor(img3_t, cv2.COLOR_BGR2RGB) #RGB 和 BGR 只是颜色通道的不同排序#添加函数 图片展示函数
def CV_Show(name,img,time,percent): scale_percent = percent # 百分比width = int(img.shape[1] * scale_percent / 100)height = int(img.shape[0] * scale_percent / 100)dim = (width, height)resized_img = cv2.resize(img, dim,interpolation=cv2.INTER_AREA)cv2.imshow(name, resized_img)cv2.waitKey(time*1000)#显示多少秒 cv2.destroyAllWindows()#腐蚀操作
kernal=np.ones((3,3),np.uint8)
erosion=cv2.erode(img3_t,kernal,iterations=5)#膨胀操作
kernal=np.ones((3,3),np.uint8)
dige_dilate=cv2.dilate(img3_t,kernal,iterations=5)#推荐使用# #梯度处理
# dst=cv2.Sobel(img3_t,-1,1,0,ksize=3)#参数为 输入图,输出图像的深度(数据类型),dx,dy(选择一个方向),Sobel 核的大小(可选,默认为 3
# cv2.imshow("gradient",dst)
# cv2.waitKey(3000)
# cv2.destroyAllWindows()#Sobel x轴梯度处理
# dst_x=cv2.Sobel(img3_t,cv2.CV_64F,1,0,ksize=3)#x,y的0,1表示取水平梯度,还是垂直梯度,但是从左到右,白到黑为正数,黑到白为负数。
# # cv2.CV_8U:8位无符号整型(常用作图像显示)
# # cv2.CV_16S:16位有符号整型(适合做边缘检测后取绝对值)
# # cv2.CV_32F:32位浮点型
# # cv2.CV_64F:64位浮点型(高精度)
# dst_x=cv2.convertScaleAbs(dst_x)#将负数值取绝对值
# cv2.imshow("dst_x",dst_x)
# cv2.waitKey(3000)
# cv2.destroyAllWindows()# #Sobel y轴梯度处理
# dst_y=cv2.Sobel(img3_t,cv2.CV_64F,0,1,ksize=3)#x,y的0,1表示取水平梯度,还是垂直梯度,但是从左到右,白到黑为正数,黑到白为负数。
# dst_y=cv2.convertScaleAbs(dst_y)#将负数值取绝对值
# cv2.imshow("dst_y",dst_y)
# cv2.waitKey(3000)
# cv2.destroyAllWindows()# #两者相结合
# dst_x_y=cv2.addWeighted(dst_x,0.5,dst_y,0.5,0)
# cv2.imshow("dst_x_y",dst_x_y)
# cv2.waitKey(3000)
# cv2.destroyAllWindows() # # #不建议直接相加
# # dst_y=cv2.Sobel(img3_t,cv2.CV_64F,1,1,ksize=3)#Scharr函数处理#更加敏感,处理更加细致,但会产生噪点
st_y=cv2.Scharr(img3_t,cv2.CV_64F,0,1)
dsst_y=cv2.convertScaleAbs(st_y)#将负数值取绝对值
cv2.imshow("st_y",dsst_y)
cv2.waitKey(3000)
cv2.destroyAllWindows()st_x=cv2.Scharr(img3_t,cv2.CV_64F,1,0)
st_x=cv2.convertScaleAbs(st_x)#将负数值取绝对值
cv2.imshow("st_x",st_x)
cv2.waitKey(3000)
cv2.destroyAllWindows()#拉普拉斯函数处理
Laplacian=cv2.Laplacian(img3_t,cv2.CV_64F)
dsst_y=cv2.convertScaleAbs(Laplacian)#将负数值取绝对值
cv2.imshow("dsst_y",dsst_y)
cv2.waitKey(3000)
cv2.destroyAllWindows()res=np.hstack(st_x,dsst_y)#展示两个图片
cv2.imshow("res",res)
cv2.waitKey(0)