import cv2
import numpy
import utils
def cv_show(name,img):
cv2.imshow(name,img)
cv2.waitKey(0)
cv2.destroyAllWindows()
#边缘检测优化方法 先对图像进行模糊处理,再转为为灰度彩色图像,再使用laplacian检测边缘。此方法可较好的避免将噪声错误地识别为边缘。
def strokeEdges(src,dst,blurKsize = 7,edgeKsize = 5):
if blurKsize >=3:
blurredSrc = cv2.medianBlur(src,blurKsize)
graySrc = cv2.cvtColor(blurredSrc,cv2.COLOR_BGR2GRAY)
else:
graySrc = cv2.cvtColor(src,cv2.COLOR_BGR2GRAY)
cv2.Laplacian(graySrc,cv2.CV_8U,graySrc,ksize = edgeKsize )
#cv_show('binary',binary)
normalizedInverseAlpha = (1.0 / 255) * (255 - graySrc)
#cv_show('normalized',normalizedInverseAlpha)
channels = cv2.split(src)
for channel in channels:
channel[:] = channel * normalizedInverseAlpha
#cv_show('channel',channel)
dst = cv2.merge(channels)
return dst
#一般的卷积滤波器方法
class VConvolutionFilter(object):
#A filter that applies a convolution to V (or all of BGR)
def __init__(self,kernel):
self._kernel = kernel
def apply(self,src):
#Apply the filter with a BGR or gray source /destination
dst = cv2.filter2D(src,-1,self._kernel)
return dst
#特定的锐化滤波器方法
class shapenFilter(VConvolutionFilter):
#A shapen filter with a 1-pixel radius
def __init__(self):
kernel = numpy.array([
[-1,-1,-1],
[-1, 9,-1],
[-1,-1,-1],
])#若不想改变图像亮度,则权重加起来为1。若使权重和为0,则得到一个边缘检测核,把边缘转化为白色,把非边缘区域转为黑色,例如下面的FindEdgesFilter方法
VConvolutionFilter.__init__(self,kernel)
#边缘检测滤波器。
class FindEdgesFilter(VConvolutionFilter):
#An edge-finding filter with a 1-pixel radius
def __init__(self):
kernel = numpy.array([
[-1,-1,-1],
[-1, 9,-1],
[-1,-1,-1],
])
VConvolutionFilter.__init__(self,kernel)
#模糊滤波器,为了达到模糊效果,通常权重和为1,而且临近像素的权重全为正。下面实现一个简单的邻近平均滤波器:
class BlurFilter(VConvolutionFilter):
#A blur filter with a 2-piexl radius
def __init__(self):
kernel = numpy.array([
[0.04,0.04,0.04,0.04,0.04],
[0.04,0.04,0.04,0.04,0.04],
[0.04,0.04,0.04,0.04,0.04],
[0.04,0.04,0.04,0.04,0.04],
[0.04,0.04,0.04,0.04,0.04],
])
VConvolutionFilter.__init__(self,kernel)
#脊状/浮雕效果滤波器
class EmbossFilter(VConvolutionFilter):
def __init__(self):
kernel = numpy.array([
[-2,-1, 0],
[-1, 9, 1],
[ 0, 1, 2],
])
VConvolutionFilter.__init__(self,kernel)
image = cv2.imread(r'C:\Users\Owen\Pictures\lena.jpg')
dst = numpy.ones((image.shape[0],image.shape[1]),dtype = numpy.int8)
dst = strokeEdges(image,dst)
cv_show('strokeEdges',dst)
shape = shapenFilter()
dst = shape.apply(image)
cv_show('strokeEdges',dst)
FindEdgesFilter = FindEdgesFilter()
dst =FindEdgesFilter.apply(image)
cv_show('FindEdgesFilter',dst)
BlurFilter = BlurFilter()
dst = BlurFilter.apply(image)
cv_show('blurfilter',dst)
EmbossFilter = EmbossFilter()
dst = EmbossFilter.apply(image)
cv_show('EmbossFilter',dst)
边缘检测优化方法图像结果:
锐化滤波器方法图像结果:
边缘检测滤波器方法图像结果:
模糊滤波器方法图像结果:
脊状/浮雕效果滤波器图像效果: