您的位置:首页 > 编程语言 > Python开发

python+opencv实现的图像直方图、直方图均衡以及图像高斯滤波

2019-03-06 22:30 1366 查看

1. 图像轮廓和直方图
下面来看两个特别的绘图实例,图像的轮廓和直方图。绘制图像的轮廓(或者其他二位函数的等轮廓线)在工作中非常常用。因为绘制轮廓需要对每个坐标【x,y】的像素值施加同一个阔值,所以首先需要将图像灰度化:
图像的直方图用来表征该图像像素值的分布情况。用一定数目的小区间(bin)来指定表征像素值的范围,每个小区间会得到落入该小区间来表示范围的像素数目。该(灰度)图像的直方图可以使用hist()函数绘制代码如下:

import numpy as np
import cv2
from PIL import Image
from pylab import *
im=array(Image.open(“D:/Program Files/image/666.jpg”).convert(‘L’))
#新建一个图像
figure()
#不使用颜色信息
gray()
#在原点左上角显示轮廓图像
contour(im,origin=‘image’)
axis(‘equal’)
axis(‘off’)
figure()
hist(im.flatten(),128)
show()
效果图为:
轮廓:
直方图
2. 直方图均衡化
图像灰度变换中一个非常有用的例子就是直方图均衡化。直方图均衡化是将一幅图像的灰度直方图变平,使变换后的图像中每个灰度值的分布概率都相同。在对图像作进一步处理之前,直方图均衡化通常是对图像灰度值进行扫一化的一个非常好的方法,并且可以增强图像的对比度
代码如下:
import numpy as np
import cv2

def hisEqulColor(img):
ycrcb = cv2.cvtColor(img, cv2.COLOR_BGR2YCR_CB)
channels = cv2.split(ycrcb)
print (len(channels))
cv2.equalizeHist(channels[0], channels[0])
cv2.merge(channels, ycrcb)
cv2.cvtColor(ycrcb, cv2.COLOR_YCR_CB2BGR, img)
return img

im = cv2.imread(“C:/Users/ASUS/Desktop/image/520.jpg”)
cv2.imshow(‘im1’, im)
cv2.waitKey(0)

eq = hisEqulColor(im)
cv2.imshow(‘image2’,eq )
cv2.waitKey(0)
cv2.imwrite(“C:/Users/ASUS/Desktop/image/523.jpg”,eq)

效果如图:
原图为:
均衡化后的图:

3. 高斯模糊
现在把卷积核换成高斯核(简单来说,方框不变,将原来每个方框的值是相等的,现在里面的值是符合高斯分布的,方框中心的值最大,其其余方框根据中西元素的距离递减,构成一个高斯小山包。原来的求平均数现在变成求加权平均数,全就是方框里面的值)。实现的函数是CV2.GaussianBlur()。我们需要制定高斯核的宽和高(必须是奇数)。以及高斯函数沿X,Y方向的标准差。如果我们只指定了X方向的标准差,Y方向也会取相同值。如果两个标准差都是0,那么函数会根据核函数的大小自己计算。高斯滤波可以有效地从图像中去除高斯噪音
实现代码为:
import numpy as np
import cv2
from PIL import Image
from pylab import *
im=array(Image.open(“C:/Users/ASUS/Desktop/image/520.jpg”).convert(‘L’))
#新建一个图像
figure()
#不使用颜色信息
gray()
#在原点左上角显示轮廓图像
contour(im,origin=‘image’)
axis(‘equal’)
axis(‘off’)
figure()
hist(im.flatten(),128)
show()

效果图为:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐