python-opencv测试 简单图片处理实现图片灰度处理、直方图、高斯滤波和直方图均衡化

1、用idle测试python-opencv
先从简单的开始测试,经过课本的学习下载相关照片处理的工具包,下载安装PIL,PIL供了通用的图像处理功能,以及大量有用的基本图像操做,好比图像缩放、裁剪、旋转、颜色转换等。PIL是免费的,能够经过网址下载,可是因为PIL版本过于陈旧因此不能和python通用,刚下载PIL时命令行输入pip install PIL会出现错误,此时的解决方案为,将PIL改为pillow,安装完成结果显示以下:

此时PIL安装成功,能够进行一些图片处理
可是图片显示还须要下载其余的包协助完成,特此安装pylab,可是pip输入pip install pylab安装pylab出现以下错误:

当出现这样的错误时不要怕,咱们还有办法来解决,这是就要安装Matplotlib啦,Matplotlib是个很好的类库,具备比PIL更强大的绘图功能,能够处理数学运算、绘制图表、或者在图像上绘制点、直线和曲线,它能够绘制高质量的图表,此前根据学习下载安装了pylab,可是下载出现如图错误,此时不要慌,不用pylab用Matplotlib也能够达到图片处理效果。pip install Matplotlib下载安装,完成后显示以下,就能够大胆的运行代码啦~~

图片运行代码为:python

from PIL import Image
from pylab import *
pil_im = Image.open('1.jpg').convert('L')
imshow(pil_im)
show()

结果显示为:

图像的颜色转换可使用convert()方法来实现,读取一张照片并将其转换程灰度图像,只需加上convert(‘L’)即结果以下所示:

2、绘制图像、点和线图像轮廓和直方图
绘制此图的步骤是首先绘制出原始图像,而后在x和y列表中给定的x坐标和y坐标上绘制出红色星标记点,最后在两个列表表示的两个点之间绘制一条线段。结果显示以下:web


其中实现代码为:svg

from PIL import Image
from pylab import *
im = array(Image.open('1.jpg'))
imshow(im)
x=[100,100,400,400]
y=[200,500,200,500]
plot(x,y,'r*')
plot(x[:2],y[:2])
title('Plotting:"1.jpg"')
show()

固然除此以外还有实现图片轮廓的处理,图像的轮廓和直方图,绘制图像的轮廓和直方图在工做中十分有用,具体代码以下所示,虽然不美观但仍是有一点点效果的(帅帅的杰哥我对不起你)
图片轮廓处理实现代码及实现效果为:函数

from PIL import Image
from pylab import *
im = array(Image.open('1.jpg').convert('L'))
figure()
gray()
contour(im,origin='image')
axis('equal')
axis('off')
imshow(im)
show()


图像的直方图用来象征该图像像素值的分布状况。用必定数目的小区间来指定表征像素值的范围,每一个小区间会获得落入该小区间表示范围的像素数目,图像的直方图可使用hist()函数绘制,在代码以下:(在原先的图片基础上再加就好)工具

figure()
hist(im.flatten (),128)
show()


3、高斯滤波
此处我也不是很懂啦,是参考别人的信息,用Sobel算子完成操做:
Sobel算子依然是一种过滤器,只是其是带有方向的。在OpenCV-Python中,使用Sobel的算子的函数原型以下:学习

dst = cv2.Sobel(src, ddepth, dx, dy[, dst[, ksize[, scale[, delta[, borderType]]]]])

前四个是必须的参数:测试

第一个参数是须要处理的图像;
第二个参数是图像的深度,-1表示采用的是与原图像相同的深度。目标图像的深度必须大于等于原图像的深度;
dx和dy表示的是求导的阶数,0表示这个方向上没有求导,通常为0、一、2。
其后是可选的参数:优化

dst不用解释了;
ksize是Sobel算子的大小,必须为一、三、五、7。 ksize=-1时,会用3x3的Scharr滤波器,它的效果要比3x3的Sobel滤波器要好
scale是缩放导数的比例常数,默认状况下没有伸缩系数;
delta是一个可选的增量,将会加到最终的dst中,一样,默认状况下没有额外的值加到dst中;
borderType是判断图像边界的模式。这个参数默认值为cv2.BORDER_DEFAULT。
代码以下:命令行

import numpy as np
import cv2
img=cv2.imread('1.jpg',cv2.IMREAD_COLOR)
x=cv2.Sobel(img,cv2.CV_16S,1,0)
y=cv2.Sobel(img,cv2.CV_16S,0,1)
absx=cv2.convertScaleAbs(x)
absy=cv2.convertScaleAbs(y)
dist=cv2.addWeighted(absx,0.5,absy,0.5,0)
cv2.imshow('y',absy)
cv2.imshow('x',absx)
cv2.imshow('dsit',dist)
cv2.waitKey(0)
cv2.destroyAllWindows()

convertScaleAbs()的原型为:code

dst = cv2.convertScaleAbs(src[, dst[, alpha[, beta]]])

其中可选参数alpha是伸缩系数,beta是加到结果上的一个值。
实验结果为:

4、直方图均衡化:
图像灰度变换中一个很是有用的例子就是直方图均衡化。直方图均衡化是指将一幅图像的灰度值方图变平,示变换后的图像中每一个灰度值的分布几率都相同。在对图像作进一步处理以前,直方图均衡化一般是对图像灰度值进行归一化的一个很是好的方法,而且能够加强图像的对比度。
对于直方图我遇到了问题,并且理论问题理解不是很透彻,正在优化中,运行代码以下,可是正在完善中——

def histep(im,nbr_bins=256)
imhist,bins=histogeram(im.flatten(),nbr_bins,normed=True)
cdf=imhist.cumsum()
cdf=255*cdf/cdf[-1]
im2=interp(im.flatten(),bins[:-1],cdf)
return im2.reshape(im.shape),cdf

from PIL import Image
from numpy import *
im=array(Image.open('1.jpg').convert('L'))
im2,cdf=imtools.histep(im)

到此,实验完成虽然不是很成功可是也算是撒花啦,之后多多学习好好完善~~