图像处理基础学习(一)

图像处理基础学习(一)

【task1】初识opencv

一、什么是OpenCV的,它有哪些优势?
二、opencv安装和环境配置
三、了解数字图像的基本概念:像素,彩色图像,灰度图像,二值图像,图像算数操作
四、练习numpy的中阵列的基本操作
五、练习图像的加载,保存,以及算术操作

一、什么是OpenCV的,它有哪些优势?

(一)、Opencv(Open Source Computer Vision Library)
Opencv中文名:开源计算机视觉库,OpenCV于1999年由Intel建立,如今由Willow Garage提供支持。OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux、Windows和Mac OS操作系统上。它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。最新版本是3.4 ,2017年12月23日发布。
(二)、Opencv的优势
(百度百科)
计算机视觉市场巨大而且持续增长,且这方面没有标准API,如今的计算机视觉软件大概有以下三种:
1、研究代码(慢,不稳定,独立并与其他库不兼容)
2、耗费很高的商业化工具(比如Halcon, MATLAB+Simulink)
3、依赖硬件的一些特别的解决方案(比如视频监控,制造控制系统,医疗设备)这是如今的现状,Opencv的优势是将标准的API将简化计算机视觉程序和解决方案的开发,OpenCV致力于成为这样的标准API。
OpenCV致力于真实世界的实时应用,通过优化的C代码的编写对其执行速度带来了可观的提升,并且可以通过购买Intel的IPP高性能多媒体函数库(Integrated Performance Primitives)得到更快的处理速度。下图为OpenCV与当前其他主流视觉函数库的性能比较。

图像处理基础学习(一)_第1张图片
这里分享几个获取资源的网站:

http://opencv.org

http://wiki.opencv.org.cn/

二、opencv安装和环境配置

这里说一下我使用的是anaconda+pycharm+opencv3.4.2.16版本
具体步骤就是下载anaconda和pycharm,之后再把anaconda搭载到pycharm,这里就不放截图了网上有很多教程可以看下
之后就是下载opencv
学习的时候建议下载Opencv3.4.2.16版本,最新版本因为版权问题有很多算法是无法实现的
下面放一下下载代码(后续有可能用到pytesseract所以提前下载)
pytesseract是google做的COR库,可以识别图片中的文字,一般用在爬虫登录时验证码的识别.

pip install opencv-python=3.4.2.16
pip install opencv-contrib-python=3.4.2.16
pip install pytesseract

完成之后调试下
这里截图一下运行代码
图像处理基础学习(一)_第2张图片
图像处理基础学习(一)_第3张图片

三、了解数字图像的基本概念:像素,彩色图像,灰度图像,二值图像,图像算数操作

下面总结下数字图像的基本概念(主要来源:《数字图像处理》第三版第二章 以及 百度百科)
(一)、像素:
1、由一个数字序列表示的图像中的一个最小单位。可以理解为一个二维数组的一个元素,其值大小表示灰度(强度)
2、像素是指由图像由的小方格组成的,这些小方块都有一个明确的位置和被分配的色彩数值,小方格颜色和位置就决定该图像所呈现出来的样子。
3、可以将像素视为整个图像中不可分割的单位或者是元素。不可分割的意思是它不能够再切割成更小单位抑或是元素,它是以一个单一颜色的小格存在 。每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。
(二)、彩色图像:
1、彩色图像,每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的,分量介于(0,255)。
图像处理基础学习(一)_第4张图片
(三)、灰度图像:
1、灰度:灰度是表明图像明暗的数值,即黑白图像中点的颜色深度,范围一般从0到255,白色为255 ,黑色为0,故黑白图片也称灰度图像。灰度值指的是单个像素点的亮度。灰度值越大表示越亮。
2、灰度级:灰度级表明图像中不同灰度的最大数量。灰度级越大,图像的亮度范围越大。
3、灰度分辨率:灰度级中可分辨的最小变化。通常说一副被量化为256级的图像有8比特的灰度分辨率。
4、灰度数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑白两种颜色,灰度图像在黑色与白色之间还有许多级的颜色深度。
5、灰度图像是二值图像的进化版本,是彩色图像的退化版,也就是灰度图保存的信息没有彩色图像多,但比二值图像多,灰度图只包含一个通道的信息,而彩色图通常包含三个通道的信息,单一通道的理解可以理解为单一波长的电磁波,所以,红外遥感,X断层成像等单一通道电磁波产生的图像都为灰度图,而且在实际中灰度图易于采集和传输等性质的存在导致基于灰度图像开发的算法非常丰富。
6、灰度图像(gray image)是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;但是,灰度图像在黑色与白色之间还有许多级的颜色深度。灰度图像经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的,用于显示的灰度图像通常用每个采样像素8位的非线性尺度来保存,这样可以有256级灰度(如果用16位,则有65536级)。

通常可以用opencv来实现彩色图像转变为灰度图像
这里放下代码

import cv2 as cv
import numpy as np


src = cv.imread("C:/Users/lenovo/PycharmProjects/learn/venv/3.jpg")
cv.namedWindow("input image",cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
get_image_info(src)
gray = cv.cvtColor(src, cv.COLOR_BGR2GRAY)
cv.imwrite("C:/Users/lenovo/PycharmProjects/learn/venv/result.png",gray)
cv.waitKey(0)
cv.destroyAllWindows()

实现图
图像处理基础学习(一)_第5张图片

(四)、二值图像
1、二值图像(Binary Image),按名字来理解只有两个值,0和1,0代表黑,1代表白,或者说0表示背景,而1表示前景。其保存也相对简单,每个像素只需要1Bit就可以完整存储信息。如果把每个像素看成随机变量,一共有N个像素,那么二值图有2的N次方种变化,而8位灰度图有255的N次方种变化,8为三通道RGB图像有255255255的N次方种变化。也就是说同样尺寸的图像,二值图保存的信息更少。二值图像(binary image),即图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示二值图像。

(五)、图像算数操作
1、图像加法
可以用cv2.add()函数对两个图像进行相加操作,也可以用NumPy:res = img1 + img2。相加的两个图片必须是同一类型,或有一个图片有一个channel。
2、图像融合
这也是图像的加法,但是它可以指定相加图像的权重,可以得到一个透明的效果。
3、图像位操作
位操作包括与(and)或(or)非(not)和异或(xor)。它在提取图像的任意部分,处理非长方形图像时很有用。
这里放一个博客,非常详细的写了图像算术操作的具体步骤以及代码
http://blog.topspeedsnail.com/archives/2098

四、练习numpy的中array的基本操作

为什么要用numpy

Python中提供了list容器,可以当作数组使用。但列表中的元素可以是任何对象,因此列表中保存的是对象的指针,这样一来,为了保存一个简单的列表[1,2,3]。就需要三个指针和三个整数对象。对于数值运算来说,这种结构显然不够高效。
Python虽然也提供了array模块,但其只支持一维数组,不支持多维数组(在TensorFlow里面偏向于矩阵理解),也没有各种运算函数。因而不适合数值运算。
NumPy的出现弥补了这些不足。

(——摘自张若愚的《Python科学计算》)

import numpy as np

以下放入的是python2的代码
(一)、数组创建

#常规创建方法
a = np.array([2,3,4])
b = np.array([2.0,3.0,4.0])
c = np.array([[1.0,2.0],[3.0,4.0]])
d = np.array([[1,2],[3,4]],dtype=complex) # 指定数据类型
print a, a.dtype)
print b, b.dtype)
print c, c.dtype
print d, d.dtype

[2 3 4] int32
[ 2.  3.  4.] float64
[[ 1.  2.]
 [ 3.  4.]] float64
[[ 1.+0.j  2.+0.j]
 [ 3.+0.j  4.+0.j]] complex128

(二)、数组的常用函数

print np.arange(0,7,1,dtype=np.int16) # 0为起点,间隔为1时可缺省(引起歧义下不可缺省)
print np.ones((2,3,4),dtype=np.int16) # 2页,3行,4列,全1,指定数据类型
print np.zeros((2,3,4)) # 2页,3行,4列,全0
print np.empty((2,3)) #值取决于内存
print np.arange(0,10,2) # 起点为0,不超过10,步长为2
print np.linspace(-1,2,5) # 起点为-1,终点为2,取5个点
print np.random.randint(0,3,(2,3)) # 大于等于0,小于3,2行3列的随机整数


[0 1 2 3 4 5 6]
[[[1 1 1 1]
  [1 1 1 1]
  [1 1 1 1]]

 [[1 1 1 1]
  [1 1 1 1]
  [1 1 1 1]]]
[[[ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]]

 [[ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]
  [ 0.  0.  0.  0.]]]
[[  1.39069238e-309   1.39069238e-309   1.39069238e-309]
 [  1.39069238e-309   1.39069238e-309   1.39069238e-309]]
[0 2 4 6 8]
[-1.   -0.25  0.5   1.25  2.  ]
[[1 0 1]
 [0 1 0]]

(三)、类型转换

print float(1)
print int(1.0)
print bool(2)
print float(True)

  

1.0
1
True
1.0

(四)、数组输出

  print np.arange(1,6,2)
    print np.arange(12).reshape(3,4) # 可以改变输出形状
    print np.arange(24).reshape(2,3,4)# 2页,3行,4页


[1 3 5]
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[[ 0  1  2  3]
  [ 4  5  6  7]
  [ 8  9 10 11]]

 [[12 13 14 15]
  [16 17 18 19]
  [20 21 22 23]]]

这里转载自
https://blog.csdn.net/qq_24193303/article/details/80965274
写的非常详细
也推荐学习numpy的中文文档,上面讲的很全
下面是链接
https://www.numpy.org.cn/index.html
numpy的练习题及答案
https://blog.csdn.net/qq_41996090/article/details/88558929

五、练习图像的加载,保存,以及算数操作

图像的加载,保存,以及算数操作在上文已显示过实现代码以及完成图了,就不在这里重复放代码了。

To be continued…

你可能感兴趣的:(Python学习,opencv)