opencv+python求图像梯度

2019-03-28  本文已影响0人  1直领悟不够

由于对图像求导后,结果有正有负,且有可能超出255,所以求梯度时要注意像素的数值类型,这里给出两种解决方法:

  1. 求梯度时将像素的数值类型转换为cv2.CV_16S来存放可能超出范围的结果,求导结束后再将其转回uint8
import cv2
import math
import numpy as np

img = cv2.imread("d:\\dmx.bmp",0)
h,w = img.shape[:2]
x=cv2.Sobel(img, cv2.CV_16S, 1, 0, ksize=3)
y=cv2.Sobel(img, cv2.CV_16S, 0, 1, ksize=3)
 
absX=cv2.convertScaleAbs(x)   # 在经过处理后,需要用convertScaleAbs()函数将其转回原来的uint8形式,否则将无法显示图像,而只是一副灰色的窗口。
absY=cv2.convertScaleAbs(y)

dst = cv2.addWeighted(absX,0.5,absY,0.5,0)  #由于Sobel算子是在两个方向计算的,最后还需要用cv2.addWeighted(...)函数将其组合起来
cv2.imshow('dst',dst)
cv2.waitKey()
src.jpg
dst.jpg
  1. 求梯度时直接用cv2.CV_32F类型保存结果,这样更精确,但结果会超出范围,所以无法显示中间结果(图片是花的),imshow时可能会报错,求导结束后将cv2.CV_32F转为uint8
sobelX = cv2.Sobel(img, cv2.CV_32F, 1, 0, ksize=3)
sobelY = cv2.Sobel(img, cv2.CV_32F, 0, 1, ksize=3)
mag, ang = cv2.cartToPolar(sobelX, sobelY)
上一篇下一篇

猜你喜欢

热点阅读