1.1 Python
Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。
1.2 OpenCV
OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows、Android和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
1.3 Anaconda
Anaconda指的是一个开源的Python发行版本,其包含了conda、Python等180多个科学包及其依赖项。
1.4 Pycharm
PyCharm是一种Python IDE,带有一整套可以帮助用户在使用Python语言开发时提高其效率的工具,比如调试、语法高亮、Project管理、代码跳转、智能提示、自动完成、单元测试、版本控制。此外,该IDE提供了一些高级功能,以用于支持Django框架下的专业Web开发。
2.1 图像的读取和展示+灰度处理
1)实现代码
import cv2 as cv
src = cv.imread("pic1.jpg") #图片的读取(图片名,1-color/0-gray)
cv.imshow("input image",src) #图片的展示(窗体名称,图片名)
cv.waitKey(0) #等待关闭 #0表示无限等待/n表示等待n毫秒后关闭
2.2 图片的写入
1)实现代码
import cv2 as cv
img = cv.imread('pic1.jpg')
cv.imwrite('image1.jpg',img) #图片的写入(新图片名,图片数据)
2.3 图片压缩
1)实现代码
import cv2 as cv
img = cv.imread('pic1.jpg')
#有损压缩
cv.imwrite('imageTest.jpg',img,[cv.IMWRITE_JPEG_QUALITY,0]) #图片质量范围为0~100
#无损压缩
cv.imwrite('imageTest.png',img,[cv.IMWRITE_PNG_COMPRESSION,9]) #图片质量范围为0~9
2)实现结果
2.4 图像数组表示+绘制图像的点和线
1)实现代码
import cv2
img=cv2.imread("pic1.JPG")
#绘制点(10,100)到点(210,100)
for i in range(1,200):
img[10+i,100]=[255,0,0] #标准蓝色
cv2.imshow('image',img)
cv2.waitKey(0) #等待延迟
import cv2 as cv
img = cv.imread("pic1.jpg")
imgInfo = img.shape #获取图片信息(图片的高度、宽度、颜色组成)
height = imgInfo[0]
weight = imgInfo[1]
#等比例缩小
dstHeight = int(height*0.5)
dstWeight = int(weight*0.5)
dst = cv.resize(img,(dstHeight,dstWeight))
cv.imshow('image',dst)
cv.waitKey(0)
import cv2 as cv
img = cv.imread("pic1.jpg")
new = img[100:300,100:500] #取原图像横坐标100-300,纵坐标100-500
cv.imshow('image',new)
cv.waitKey(0)
import cv2 as cv
import numpy as np
img = cv.imread("pic1.jpg")
cv.imshow('image',img)
imgInfo = img.shape #获取图片信息(图片的高度、宽度、颜色组成)
height = imgInfo[0]
weight = imgInfo[1]
matShift = np.float32([[1,0,100],[0,1,200]]) #两行三列
dst = cv.warpAffine(img,matShift,(height,weight)) #原图数据,移位矩阵,图片信息
cv.imshow('imageGo',dst)
cv.waitKey(0)
2.8 图片旋转
1)实现代码
import cv2 as cv
import numpy as np
img = cv.imread("pic1.jpg")
cv.imshow('image',img)
imgInfo = img.shape #获取图片信息(图片的高度、宽度、颜色组成)
height = imgInfo[0]
weight = imgInfo[1]
matRoutate = cv.getRotationMatrix2D((height*0.5,weight*0.5),45,0.5) #旋转中心,旋转角度,缩放系数
dst = cv.warpAffine(img,matRoutate,(height,weight)) #原图数据,移位矩阵,图片信息
cv.imshow('imageGo',dst)
cv.waitKey(0)
2)实现结果
2.9 绘制图像彩色直方图
1)函数介绍(参考链接https://blog.csdn.net/js_xh/article/details/79262886)
我们使用cv.calcHist()函数来找到直方图。
cv.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
images:它是uint8类型或float32的源图像。它应该用方括号括起来,也就是”[img]”。
channels:它也用方括号括起来。它是我们计算直方图的信道的索引。例如,如果输入是灰度图像,它的值是0。对于颜色图像,您可以通过0、1或2来分别计算蓝色、绿色或红色通道的直方图。
mask:遮罩图。为了找到完整图像的直方图,它被指定为“None”。但如果你想找到图像的特定区域的直方图,你必须为它创建一个遮罩图,并将其作为遮罩。
histSize:这代表了我们的BINS数。需要用方括号来表示。在整个范围内,我们通过了256。
ranges:强度值范围,通常是 [ 0,256 ]
2)实现代码
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('pic1.jpg')
color = ('b', 'g', 'r') #蓝,绿,红
for i, col in enumerate(color):
histr = cv.calcHist([img], [i], None, [256], [0,256])
plt.plot(histr, color=col)
plt.xlim([0,256])
plt.show()
import cv2
import numpy as np
img = cv2.imread("pic1.jpg", 1)
cv2.imshow("src", img)
# 彩色图像均衡化,需要分解通道 对每一个通道均衡化
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)
# 合并每一个通道
result = cv2.merge((bH, gH, rH))
cv2.imshow("dst", result)
cv2.waitKey(0)
2)实现结果
2.11 高斯模糊
1)函数说明
高斯模糊本质上是低通滤波器,输出图像的每个像素点是原图像上对应像素点与周围像素点的加权。
高斯分布权重矩阵,就是对二维正态分布的密度函数(也就是高斯函数)采样再做归一化的产物。
使用opencv做高斯模糊,调用GaussianBlur函数,给出高斯矩阵的尺寸和标准差即可:
blur = cv2.GaussianBlur(img,(5,5),0)
其中,(5, 5)表示高斯矩阵的长与宽都是5,标准差取0时OpenCV会根据高斯矩阵的尺寸自己计算。通常,高斯矩阵的尺寸越大,标准差越大,处理过的图像模糊程度越大。
2)实现代码
import numpy as np
import cv2
img = cv2.imread('pic1.jpg')
img_ = cv2.GaussianBlur(img, ksize=(9, 9), sigmaX=0, sigmaY=0)
cv2.imshow('Source image',img)
cv2.imshow('blur image',img_)
cv2.waitKey()
from PIL import Image
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
im = array(Image.open('pic1.jpg').convert('L'))
figure()
subplot(121)
gray()
contour(im, origin='image')
axis('equal')
axis('off')
title(u'图像轮廓')
subplot(122)
hist(im.flatten(), 128)
title(u'图像直方图')
plt.xlim([0, 260])
plt.ylim([0, 11000])
show()
主要通过课本的阅读结合网上的教学视频学习的,推荐的教学视频有:
https://www.bilibili.com/video/av29600072?t=1161
以及https://www.bilibili.com/video/av69168847?t=386&p=9
4.1 环境的配置耗时较长,后面有找到一个较详细的安装教程,还有需要的可以参考这篇 Anaconda+Pycharm安装手册
4.2 关于图像的一些基本概念:
4.2.1 像素:像素是指由图像的小方格组成的,这些小方块都有一个明确的位置和被分配的色彩数值,小方格颜色和位置就决定该图像所呈现出来的样子。
4.2.2 图像颜色:图像颜色是由RGB组合而成的,8bit的颜色深度在0-255之间
4.2.3 图片的宽高:图片宽高的大小表示的是像素点的个数
4.2.4 图片的大小计算:图片的大小=宽 * 高 * 3(RGB三色)* 8(8位)/8(转换成字节)
4.2.5 RGB alpha:RGB alpha表示图片的透明度信息
4.3 运行代码出现的问题及解决:
4.3.1:AttributeError: module ‘matplotlib’ has no attribute ‘plot’
导入包时是这样写的:import matplotlib as plt
应该改成:import matplotlib.pyplot as plt
4.3.2:matShift = np.float([[1,0,100],[0,1,200]]) #两行三列
TypeError: float() argument must be a string or a number, not ‘list’
应该改成matShift = np.float32([[1,0,100],[0,1,200]]) #两行三列
4.4 opencv+python是很好用的图像处理工具,与Matlab有很多相似之处,借助于函数,可以很方便地实现基本的图像处理操作。