cv2.CV_16S
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)
y=cv2.Sobel(img,cv2.CV_16S,0,1,ksize=3)
'''
在经过处理后,别忘了用convertScaleAbs()函数将其转回原来的uint8形式。
否则将无法显示图像,而只是一副灰色的窗口。
dst = cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])
其中可选参数alpha是伸缩系数,beta是加到结果上的一个值。结果返回uint8类型的图片。
'''
absX=cv2.convertScaleAbs(x)
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)
sobelx8u = cv2.Sobel(img,cv2.CV_8U,1,0,ksize=7)
sobelx64f = cv2.Sobel(img,cv2.CV_64F,1,0,ksize=5)
abs_sobel64f = np.absolute(sobelx64f)
sobel_8u = np.uint8(abs_sobel64f)
import cv2
image = "test.jpg"
frame = cv2.imread(image)
img2gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
score = cv2.Laplacian(img2gray, cv2.CV_64F).var()
print "Laplacian score of given image is ", score
if score > 100:
print "Good image!"
else:
print "Bad image!"