python+OpenCV的安装及用python做图像处理
**
一,安装anaconda3
anaconda3下载网站:https://www.continuum.io/downloads
建议你下载左边的Python3.X版本而不是Python2.X版本
因为2和3版本的语法是有差异的,而且版本更新肯定是在优化啦
Python2.X版本将在 2020年4月12日 退休。退休后将不再进行任何维护。
图中根据你的计算机选择是64位还是32位的下载安装。
下载完成后,点击安装,一路next,动作行云流水。
安装好后,需要配置环境变量。
找到刚下载好的anaconda3
找到Anaconda3文件夹下的Scripts,双击打开,点击下路径,复制路径
之后点击“我的电脑”->“属性”->“高级系统设置”->“系统变量中的‘path’’”,把路径E:\Anaconda3\Scripts粘贴到“path”下。
打开cmd
输入jupyter notebook
这时应该可以了
然后会出现一个网页
恭喜你,安装成功了。
之所以选择用Anaconda安装python,是因为Anaconda是Python的集成环境安装好就自带很多你常用的包,你用的时候直接导入就行啦,不用再一个个分别装了
**
二把相关包更新到最新版本
如果电脑已经安装Annaconda,可能存在numpy,scipy包版本过低,那么打开Annaconda Prompt先后敲入以下代码等待安装成功:
conda update numpy
conda update scipy
或者可能你的电脑Annaconda很久没更新库文件了也可尝试如下代码对所有库文件进行更新。
conda update --all
三、查看版本
cmd中输入“python”可以查看当前python的版本
python3.6 64bit
四、下载对应版本的文件
下载网址:http://www.lfd.uci.edu/~gohlke/pythonlibs/
进入网站后,下拉,找到opencv,选择合适的版本
网址里没有opencv_python-3.4版本,这里我在另一个地方下载
链接:https://pan.baidu.com/s/1RRUbzKNgOTazNbW2e8WxBQ
提取码:v0ow
下载下来的whl文件名opencv_python-3.4.0.12-cp36-cp36m-win_amd64.whl改成opencv_python-3.4.0.12-cp36-none-win_amd64.whl, 必须得改不然安装不上。
五、win+r 在命令行中处输入
pip install 路径名\opencv_python-3.4.0.12-cp36-none-win_amd64.whl
六、成功安装
cmd输入python,然后输入import cv2,如果没有错误显示,则安装成功。
到这里python就基本安装好了。
接下来就是用python做图像处理了。
PIL-Python图像库
PIL (Python Imaging Library)图像库提供了很多常用的图像处理及很多有用的图像基本操作。
# -*- coding: utf-8 -*-
"""
Created on Sun Mar 17 10:37:10 2019
@author: Lenovo
"""
from PIL import Image
from pylab import *
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
figure()
pil_im = Image.open('E:/images/1.jpg')
gray()
subplot(121)
title(u'原图',fontproperties=font)
axis('off')
imshow(pil_im)
pil_im = Image.open('E:/images/1.jpg').convert('L')
subplot(122)
title(u'灰度图',fontproperties=font)
axis('off')
imshow(pil_im)
show()
图:
**创建缩略图:**
利用PIL可以很容易的创建缩略图,设置缩略图的大小,并用元组保存起来,调用thumnail()方法即可生成缩略图。创建缩略图的代码见下面。
拷贝并粘贴区域:
调用crop()方法即可从一幅图像中进行区域拷贝,拷贝出区域后,可以对区域进行旋转等变换。关于拷贝、旋转粘贴的代码见下面。
调整尺寸及旋转:
要对一幅图像的尺寸进行调整,可以调用resize()方法,元组中放置的便是你要调整尺寸的大小。如果要对图像进行旋转变换的话,可以调用rotate()方法。
下面代码显示上面提到的所有的图像处理操作,即原图显示、RGB图像转为灰度图像、拷贝粘贴区域、生成缩略图、调整图像尺寸、图像旋转变换的实例代码:
# -*- coding: utf-8 -*-
from PIL import Image
from pylab import *
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
figure()
# 显示原图
pil_im = Image.open('E:/images/1.jpg')
print (pil_im.mode, pil_im.size, pil_im.format)
subplot(231)
title(u'原图', fontproperties=font)
axis('off')
imshow(pil_im)
# 显示灰度图
pil_im = Image.open('E:/images/1.jpg').convert('L')
gray()
subplot(232)
title(u'灰度图', fontproperties=font)
axis('off')
imshow(pil_im)
#拷贝粘贴区域
pil_im = Image.open('E:/images/1.jpg')
box = (100,100,400,400)
region = pil_im.crop(box)
region = region.transpose(Image.ROTATE_180)
pil_im.paste(region,box)
subplot(233)
title(u'拷贝粘贴区域', fontproperties=font)
axis('off')
imshow(pil_im)
# 缩略图
pil_im = Image.open('E:/images/1.jpg')
size = 128, 128
pil_im.thumbnail(size)
print (pil_im.size)
subplot(234)
title(u'缩略图', fontproperties=font)
axis('off')
imshow(pil_im)
pil_im.save('E:/images/thumbnail.jpg') #保存缩略图
# 调整图像尺寸
pil_im = Image.open('E:/images/1.jpg')
pil_im = pil_im.resize(size)
print (pil_im.size)
subplot(235)
title(u'调整尺寸后的图像', fontproperties=font)
axis('off')
imshow(pil_im)
# 旋转图像45°
pil_im = Image.open('E:/images/1.jpg')
pil_im = pil_im.rotate(45)
subplot(236)
title(u'旋转45°后的图像', fontproperties=font)
axis('off')
imshow(pil_im)
show()
Matplotlib库
当在处理数学及绘图或在图像上描点、画直线、曲线时,Matplotlib是一个很好的绘图库,它比PIL库提供了更有力的特性。Matplotlib是开源的当在处理数学及绘图或在图像上描点、画直线、曲线时,Matplotlib是一个很好的绘图库,它比PIL库提供了更有力的特性。Matplotlib是开源的。
画图、描点和线
虽然Matplotlib可以创建漂亮的条状图、饼图、散点图等,但是在很多计算机视觉应用场合,其实只用到了一些常用的命令。下面展示在一幅图像上描一些点和画一条直线的例子。
from PIL import Image
from pylab import *
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
im = array(Image.open('E:/images/1.jpg'))
figure()
# 画有坐标轴的
subplot(121)
imshow(im)
x = [100, 100, 400, 400]
y = [200, 500, 200, 500]
plot(x, y, 'r*')
plot(x[:2], y[:2])
title(u'绘图: "empire.jpg"', fontproperties=font)
# 不显示坐标轴
subplot(122)
imshow(im)
x = [100, 100, 400, 400]
y = [200, 500, 200, 500]
plot(x, y, 'r*')
plot(x[:2], y[:2])
axis('off') #显示坐标轴
title(u'绘图: "empire.jpg"', fontproperties=font)
show()
图像轮廓和直方图
图像轮廓线和图线等高线。在画图像轮廓前需要转换为灰度图像,因为轮廓需要获取每个坐标[x,y]位置的像素值。下面是画图像轮廓和直方图的代码:
from PIL import Image
from pylab import *
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
im = array(Image.open('E:/images/1.jpg').convert('L')) # 打开图像,并转成灰度图像
figure()
subplot(121)
gray()
contour(im, origin='image')
axis('equal')
axis('off')
title(u'图像轮廓', fontproperties=font)
subplot(122)
hist(im.flatten(), 128)
title(u'图像直方图', fontproperties=font)
plt.xlim([0,260])
plt.ylim([0,11000])
show()
灰度变换
在读入图像到NumPy数组后,就可以对它进行任何我们想要的操作了。对图像进行灰度变换便是一个简单的例子。
#灰度变换
from PIL import Image
from numpy import *
from pylab import *
im = array(Image.open('E:/images/1.jpg').convert('L'))
print (int(im.min()), int(im.max()))
im2 = 255 - im # invert image
print (int(im2.min()), int(im2.max()))
im3 = (100.0/255) * im + 100 # clamp to interval 100...200
print (int(im3.min()), int(im3.max()))
im4 = 255.0 * (im/255.0)**2 # squared
print (int(im4.min()), int(im4.max()))
figure()
gray()
subplot(1, 3, 1)
imshow(im2)
axis('off')
title(r'$f(x)=255-x$')
subplot(1, 3, 2)
imshow(im3)
axis('off')
title(r'$f(x)=\frac{100}{255}x+100$')
subplot(1, 3, 3)
imshow(im4)
axis('off')
title(r'$f(x)=255(\frac{x}{255})^2$')
show()
上面左边灰度变换函数采用的是f(x)=255-x,中间采用的是f(x)=(100/255)x+100,右边采用的是变换函数是f(x)=255(x/255)^2。
直方图均衡化
一个极其有用的例子是灰度变换后进行直方图均衡化。图像均衡化作为预处理操作,在归一化图像强度时是一个很好的方式,并且通过直方图均衡化可以增加图像对比度。下面是对图像直方图进行均衡化处理的例子:
from PIL import Image
from pylab import *
from PCV.tools import imtools
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
im = array(Image.open('E:/images/1.jpg').convert('L')) # 打开图像,并转成灰度图像
im2, cdf = imtools.histeq(im)
figure()
subplot(2, 2, 1)
axis('off')
gray()
title(u'原始图像', fontproperties=font)
imshow(im)
subplot(2, 2, 2)
axis('off')
title(u'直方图均衡化后的图像', fontproperties=font)
imshow(im2)
subplot(2, 2, 3)
axis('off')
title(u'原始直方图', fontproperties=font)
#hist(im.flatten(), 128, cumulative=True, normed=True)
hist(im.flatten(), 128, normed=True)
subplot(2, 2, 4)
axis('off')
title(u'均衡化后的直方图', fontproperties=font)
#hist(im2.flatten(), 128, cumulative=True, normed=True)
hist(im2.flatten(), 128, normed=True)
show()
图像降噪
我们以一个非常有用的例子结束本章。图像降噪是一个在尽可能保持图像细节和结构信息时去除噪声的过程。我们采用Rudin-Osher-Fatemi de-noising(ROF)模型。图像去噪可以应用于很多场合,它涵盖了从你的度假照片使之更好看到卫星照片质量提高。
from PIL import Image
from pylab import *
from numpy import *
from numpy import random
from scipy.ndimage import filters
from scipy.misc import imsave
from PCV.tools import rof
""" This is the de-noising example using ROF in Section 1.5. """
# 添加中文字体支持
from matplotlib.font_manager import FontProperties
font = FontProperties(fname=r"c:\windows\fonts\SimSun.ttc", size=14)
im = array(Image.open('E:/images/1.jpg').convert('L'))
U,T = rof.denoise(im,im)
G = filters.gaussian_filter(im,10)
# save the result
#imsave('synth_original.pdf',im)
#imsave('synth_rof.pdf',U)
#imsave('synth_gaussian.pdf',G)
# plot
figure()
gray()
subplot(1,3,1)
imshow(im)
#axis('equal')
axis('off')
title(u'原噪声图像', fontproperties=font)
subplot(1,3,2)
imshow(G)
#axis('equal')
axis('off')
title(u'高斯模糊后的图像', fontproperties=font)
subplot(1,3,3)
imshow(U)
#axis('equal')
axis('off')
title(u'ROF降噪后的图像', fontproperties=font)
show()