大家好!我是第一次写博客,可能会有很多步骤不明确的地方,欢迎大家指教,后期会有所改善。 其实安装好python3过后很好安装opencv,而且python3自带的pip.exe能够很快的导入一些安装模块语句。这篇文章是最基础的IDLE版的编译运行,在安装opencv的过程过程中可能遇到一些小问题,以下会有相应的讲解,安装成功后会在IDLE上运行测试一些关于计算机视觉方面的代码,例如:图像的显示、图像的直方图、图像的高斯滤波处理及直方图均衡化处理等等。
首先要在自己的电脑上安装一个python3的版本,不论是3.7.0还是其他版本,只要是python3的版本就可以运行一下的操作。如果没有安装python可以自己去百度上下载,百度上有很好的安装教程,讲解很明白。
如果出现上面情况,说明python的pip.exe路径没找到;所以只要进入到正确的路径,就可以成功执行。
例如:我的python的pip.exe存放在:D:\Python37\Scripts
则要把C盘转换到D盘,转换命令为:d:
最后再转换到pip.exe目录的相对路径的命令语句:cd D:\Python37\Scriptsxianzai
现在可以再输入一遍:pip.exe
得到以上结果就说明当前的pip可以使用。这样就可以在命令行上输入导入opencv的语句:pip install opencv-python。要注意的是:如果直接输入:pip iastall opencv。会导入模块失败,这是因为在现在的python都是pyhton3的版本,自带的opencv名是opencv-python。
因为我已经导入成功过,所以会显示已经下载成功。如果第一次导入,显示正在下载进度条说明正在下载,可能有些电脑会有下载久一点,只要最后显示成功下载:numpy opencv-python就说明下载安装成功。
首先在自己电脑的搜索烂输入:IDLE,然后选择编译器点进去。
再点击File,创建一个new file,在创建的文件里写测试代码;
import cv2
import numpy
img=cv2.imread('test1.jpg',1)
#img
cv2.imshow("image",img)
如果没有报错且得出以下结果:说明安装成功!
from PIL import Image
from pylab import *
#读取图像到数组中
im=array(Image.open('test1.jpg'))
#绘制图像
imshow(im)
#定义一些点的位置
x=[100,100,400,400]
y=[100,250,100,350]
#使用红色的星状标记
plot(x,y,'r*')
#绘制连接前三个点
plot(x[:3],y[:3])
title('plotting:test1.jpg')
show()
#消除坐标轴
#axis('off')
(1)绘制图像的轮廓需要对每个坐标[x,y]的像素值施加同一个阈值,左右首先就要将图像灰度化。图像灰度化转换可以使用convert()函数实现,只需要在读取图片后面加上.convert('L')。
(2)绘制直方图时,hist()函数只接受一维数组输入,所以在进行图像直方图之前要对图像进行压平处理。flatten()方法将任意数组按照行优先准则转换成一维数组。
from PIL import Image
from pylab import *
#读取图像到数组里
im=array(Image.open('test1.jpg').convert('L'))
figure()
#不使用颜色信息
gray()
contour(im,origin='image')
axis('equal')
axis('off')
figure()
#绘制直方图
hist(im.flatten(),128)#hist()函数的第二个参数为指定小区间的数目,可以适当根据自己的图片取值
show()
SciPy用scipy.ndimage import filters模块来做滤波,该模块使用快速一维分离方法计算卷积。
如何显示中文标题相关信息链接:https://zhidao.baidu.com/question/2144245729169338868.html
from PIL import Image
from numpy import *
from pylab import *
from scipy.ndimage import filters
#动态设置标题显示中文
mpl.rcParams['font.sans-serif'] = ['SimHei']
#读取图像到数
im=array(Image.open('test1.jpg'))
im2=zeros(im.shape)
for i in range(3):
im2[:,:,i]=filters.gaussian_filter(im[:,:,i],2)
im3=uint8(im2)
for i in range(3):
im2[:,:,i]=filters.gaussian_filter(im[:,:,i],5)
im4=uint8(im2)
figure()
subplot(1,3,1),imshow(im),title('原图')
axis('off')
subplot(1,3,2),imshow(im3),title('标准度为2的图像')
axis('off')
subplot(1,3,3),imshow(im4),title('标准度为5的图像')
axis('off')
show()
绘制直方图均衡化相关解释博客链接:https://blog.csdn.net/zhuoyuezai/article/details/79635557
https://blog.csdn.net/jacke121/article/details/79223144
from PIL import Image
from numpy import *
from pylab import *
import os
import matplotlib.pyplot as plt
mpl.rcParams['font.sans-serif'] = ['SimHei']
def histep(im,nbr_bins=256):
"""对一幅灰度图像进行直方图均衡化"""
#计算图像直方图
imhist,bins=histogram(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
#im2是均衡化的像素图像
im=array(Image.open('test1.jpg').convert('L'))
im2,cdf=histep(im)#调用直方图均衡化函数,nbr_bins是函数内自定义数值,所以调用函数即使没有赋值也能自行调用
#im0=Image.fromarray(im)#未均衡化将array转换为图像
#im3=Image.fromarray(im2)#将均衡化array转换为图像
#im3.show()
figure()
subplot(2,2,1),imshow(im,plt.cm.gray),title('原图')
subplot(2,2,2),hist(im.flatten(),255),title('原图直方图')
subplot(2,2,3),imshow(im2,plt.cm.gray),title('均衡化图像')
subplot(2,2,4),hist(im2.flatten(),255),title('均衡化直方图')
show()
在编写代码的时候一定要记得,imshow()和hist()的区别,我就犯过很多次这样的错误。在imshow()过后就不要再hist(),这样重复写会出现图像数据无法转换为float的错误。因为imshow显示的是255~0之间的像素,而hist表示的是double类型的像素,会出现无法转换像素类型。
从下的图可以看出均衡化直方图对比原图直方图,可以看出图像的对比度增强,原先的图像灰色区域的细节变得清晰了。由于我测试的图片像素之间差别不大,可以看到原直方图图像像素就比较接近均衡化结果,所以显示出来的图像灰度区间对比不是很强,但是从直方图也能看出有均衡化效果。
#编译运行后会出现上面的警告,表示在非均匀分档上传递`normed = True`一直被打破,既不计算概率密度函数也不计算概率质量函数。结果只有在箱子是均匀的时才是正确的,当密度= True时,无论如何都会产生相同的结果错误。虽然有警告但是还可以输出结果,在后面的python3版本中这种均衡化函数histep()被删除,所有会出现版本之间的差异错误,之后会继续改善做相应的改对。如果不用python2版的均衡化函数,目前简单可以直接调用opencv里的直方图均衡化函数cv2.equalizeHist,但是用cv2.equalizeHist进行直方图均衡化处理,只能对单通道进行处理。