Python——OpenCV库的学习(九):图像梯度

笔记和用法都在代码注释中 :

import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt


#---------------------------------彩色图像进行梯度运算之后,十分辣眼睛!!!
# img = cv.imread('666.jpg')
# img = cv.resize(img,(500,500))
#
# #-------------------格式: sobelx = cv.Sobel(img,ddepth,dx,dy,ksize = 3)
# ============================ksize是Sobel算子的大小
# ============================ddepth是图像的深度

#-------------------------注意计算形式!!!  (右减左,下减上!!!)
#当dx为0,dy为1时,为垂直计算 : 下 - 上 !!!
#当dx为1,dy为0时,为水平计算 : 右边-左边   (图像矩阵中:右边-左边)
#并且计算的内容,类似于高斯计算,离得像素点越近的数值,就越大!!!
# --------------------------------------重点:因为是减法,那么就不免有负数,所以我们后面需要进行绝对值处理!!!


# sobelx = cv.Sobel(img,cv.CV_64F,1,0,ksize = 3)  #现在dx为1,dy为0,则是代表进行水平计算
#
# cv.imshow('sobelx',sobelx)
# cv.waitKey(0)
# cv.destroyAllWindows()

#---------------------------------进行绝对值处理的 : 黑白图像 ( 这样就看着比较顺眼了!!! )
#
# img = cv.imread('666.jpg',cv.IMREAD_GRAYSCALE)
# img = cv.resize(img,(500,500))
#
# #-------------------格式: sobelx = cv.Sobel(img,cv.CV_64F,dx,dy,ksize = 3)ksize是Sobel算子的大小
# sobelx = cv.Sobel(img,cv.CV_64F,1,0,ksize = 3)  #现在dx为1,dy为0,则是代表进行水平计算
#
# sobelx = cv.convertScaleAbs(sobelx)     #进行绝对值处理!!!
#
# cv.imshow('sobelx',sobelx)
# cv.waitKey(0)
# cv.destroyAllWindows()

# ---------------------------------------现在进行垂直计算:---------(与上图有区别,您细品)

# img = cv.imread('666.jpg',cv.IMREAD_GRAYSCALE)
# img = cv.resize(img,(500,500))
#
# #-------------------格式: sobelx = cv.Sobel(img,cv.CV_64F,dx,dy,ksize = 3)ksize是Sobel算子的大小
# sobely = cv.Sobel(img,cv.CV_64F,0,1,ksize = 3)  #现在dx为0,dy为1,则是代表进行垂直计算
#
# sobely = cv.convertScaleAbs(sobely)     #进行绝对值处理!!!
#
# cv.imshow('sobely',sobely)
# cv.waitKey(0)
# cv.destroyAllWindows()

#--------------------------------------现在将水平和垂直融合在一起计算-------------(图像效果不太好!!!)
# (但是效果会叠加,不太好,建议:分别运算垂直和水平,然后在按照我们想要的效果进行加减法!!
# 或者是去 : 融合图像!!!(前面的操作有融合图像的操作!!))

# img = cv.imread('666.jpg',cv.IMREAD_GRAYSCALE)
# img = cv.resize(img,(500,500))
#
# #----------格式: sobelx = cv.Sobel(img,cv.CV_64F,dx,dy,ksize = 3)ksize是Sobel算子的大小
# sobelxy = cv.Sobel(img,cv.CV_64F,1,1,ksize = 3)  #现在dx为1,dy为1,则是代表进行水平垂直一起计算!!!
# 
# sobelxy = cv.convertScaleAbs(sobelxy)     #进行绝对值处理!!!
#
# cv.imshow('sobelxy',sobelxy)
# cv.waitKey(0)
# cv.destroyAllWindows()


#-------------------------------所以: 我们进行分别操作,然后融合图像!!!!!-----------

# img = cv.imread('666.jpg',cv.IMREAD_GRAYSCALE)
# img = cv.resize(img,(500,500))
#
# #----------格式: sobelx = cv.Sobel(img,cv.CV_64F,dx,dy,ksize = 3)ksize是Sobel算子的大小
# sobelx = cv.Sobel(img,cv.CV_64F,1,0,ksize = 3)  #现在dx为1,dy为0,则是代表进行水平计算!!!
# sobely = cv.Sobel(img,cv.CV_64F,0,1,ksize = 3)  #现在dx为0,dy为1,则是代表进行垂直计算!!!
# sobelx = cv.convertScaleAbs(sobelx)     #进行绝对值处理!!!
# sobely = cv.convertScaleAbs(sobely)     #进行绝对值处理!!!
#
# sobelxy = cv.addWeighted(sobelx,0.5,sobely,0.5,0)
#
# cv.imshow('sobelxy',sobelxy)
# cv.waitKey(0)
# cv.destroyAllWindows()

#还有的算子: Scharr算子,laplacian算子

#接下来 : ----------------------------------------进行比较!!!!
img = cv.imread('666.jpg',cv.IMREAD_GRAYSCALE)
img = cv.resize(img,(500,500))

#----------- sobel算子!!! -----------
sobelx = cv.Sobel(img,cv.CV_64F,1,0,ksize = 3)  #现在dx为1,dy为0,则是代表进行水平计算!!!
sobely = cv.Sobel(img,cv.CV_64F,0,1,ksize = 3)  #现在dx为0,dy为1,则是代表进行垂直计算!!!
sobelx = cv.convertScaleAbs(sobelx)     #进行绝对值处理!!!
sobely = cv.convertScaleAbs(sobely)     #进行绝对值处理!!!
sobelxy = cv.addWeighted(sobelx,0.5,sobely,0.5,0)

#----------- scharr算子!!! -----------(更容易受噪音点影响!!!)对像素点更加敏感,把图像描绘得更加细致!!!
scharrx = cv.Scharr(img,cv.CV_64F,1,0)
scharry = cv.Scharr(img,cv.CV_64F,0,1)
scharrx = cv.convertScaleAbs(scharrx)     #进行绝对值处理!!!
scharry = cv.convertScaleAbs(scharry)     #进行绝对值处理!!!
scharrxy = cv.addWeighted(scharrx,0.5,scharry,0.5,0)

#----------- laplacian算子!!! -----------(操作更简单!!!)
laplacian = cv.Laplacian(img,cv.CV_64F)
laplacian = cv.convertScaleAbs(laplacian)

#--------------------------------------------------三张图一起打印,看看效果!!!
# res = np.hstack((sobelxy,scharrxy,laplacian))
#
# cv.imshow('res',res)
# cv.waitKey(0)
# cv.destroyAllWindows()


# --------------------------------边缘检测!!!综合了前面几种的情况!!(Canny边缘检测!!!)
img = cv.imread('666.jpg')
img = cv.resize(img,(500,500))

v1 = cv.Canny(img,80,150)  #更改数值,体验不同效果!!!
v2 = cv.Canny(img,50,100)  #数值越小, 那么显示得越详细!!!

res = np.hstack((v1,v2))

cv.imshow('res',res)
cv.waitKey(0)
cv.destroyAllWindows()

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Pan_peter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值