python opencv 图片梯度

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/TingHW/article/details/84527424
# OpenCV提供了三种类型的梯度过滤器或者高通滤波器,Sobel,Scharr和Laplacian

cv2.CV_16S

# Sobel算子 
 
# Sobel算子依然是一种过滤器,只是其是带有方向的。在OpenCV-Python中, 
# 使用Sobel的算子的函数原型如下: 
# dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]]) 
# ksize是Sobel算子的大小,必须为1、3、5、7。 
# scale是缩放导数的比例常数,默认情况下没有伸缩系数; 
# delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中; 
# borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('black_white2.jpg',0)
  
  
'''
在Sobel函数的第二个参数这里使用了cv2.CV_16S。因为OpenCV文档中对Sobel算子的介绍 
中有这么一句:Sobel函数求完导数后会有负值,还有会大于255的值。而原图像是uint8, 
即8位无符号数,所以Sobel建立的图像位数不够,会有截断。 
因此要使用16位有符号的数据类型,即cv2.CV_16S。 
'''  
x=cv2.Sobel(img,cv2.CV_16S,1,0,ksize=3)#对x求导  
y=cv2.Sobel(img,cv2.CV_16S,0,1,ksize=3)#对y求导  
  
'''
在经过处理后,别忘了用convertScaleAbs()函数将其转回原来的uint8形式。 
否则将无法显示图像,而只是一副灰色的窗口。 
dst = cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])   
其中可选参数alpha是伸缩系数,beta是加到结果上的一个值。结果返回uint8类型的图片。 
'''  
absX=cv2.convertScaleAbs(x)   # 转回uint8   
absY=cv2.convertScaleAbs(y)  
  
''''' 
由于Sobel算子是在两个方向计算的,最后还需要用cv2.addWeighted(...)函数将其组合起来 
。其函数原型为: 
dst = cv2.addWeighted(src1, alpha, src2, beta, gamma[, dst[, dtype]])   
其中alpha是第一幅图片中元素的权重,beta是第二个的权重, 
gamma是加到最后结果上的一个值。 
'''  
dst = cv2.addWeighted(absX,0.5,absY,0.5,0)   
  
cv2.imshow('absX',absX)  
cv2.imshow('absY',absY)  
cv2.imshow('Result',dst)  
  
cv2.waitKey(0)  
cv2.destroyAllWindows() 

''''' 
Laplacian算子 
图像中的边缘区域,像素值会发生“跳跃”,对这些像素求导,在其一阶导数在边缘 
位置为极值,这就是Sobel算子使用的原理——极值处就是边缘。如果对像素值求二阶导数, 
会发现边缘处的导数值为0 
 
Laplace函数实现的方法是先用Sobel 算子计算二阶x和y导数,再求和: 
 
在OpenCV-Python中,Laplace算子的函数原型如下: 
dst = cv2.Laplacian(src, ddepth[, dst[, ksize[, scale[, delta[, borderType]]]]])   
第一个参数是需要处理的图像; 
第二个参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度; 
 
dst不用解释了; 
ksize是算子的大小,必须为1、3、5、7。默认为1。 
scale是缩放导数的比例常数,默认情况下没有伸缩系数; 
delta是一个可选的增量,将会加到最终的dst中,同样,默认情况下没有额外的值加到dst中; 
borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。 
'''  
  
import cv2  
import numpy as np   
  
img=cv2.imread('black_white2.jpg',0)  
blur = cv2.bilateralFilter(img,9,75,75)  

dst2=cv2.Laplacian(blur,cv2.CV_64F,ksize=1)
print(dst2.dtype)                        
                        
cv2.imshow('laplacian',dst2)   
cv2.waitKey(0)  
cv2.destroyAllWindows()  
float64
import cv2
import numpy as np
from matplotlib import pyplot as plt

img = cv2.imread('black_white2.jpg',0)

# Output dtype = cv2.CV_8U
sobelx8u = cv2.Sobel(img,cv2.CV_8U,1,0,ksize=7)

# Output dtype = cv2.CV_64F. Then take its absolute and convert to cv2.CV_8U
# 图像格式转换
sobelx64f = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.uint8(abs_sobel64f)


# 利用Laplacian变换进行图像模糊检测

import cv2

image = "test.jpg"
frame = cv2.imread(image)
img2gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)  # 将图片压缩为单通道的灰度图
# img_resize = cv2.resize(img2gray, (112, 112))  # 为方便与其他图片比较可以将图片resize到同一个大小
score = cv2.Laplacian(img2gray, cv2.CV_64F).var()
print "Laplacian score of given image is ", score
if score > 100:  # 这个值可以根据需要自己调节,在我的测试集中100可以满足我的需求。
    print "Good image!"
else:
    print "Bad image!"

猜你喜欢

转载自blog.csdn.net/TingHW/article/details/84527424