摘要:本文讲解图像处理基础知识和OpenCV入门函数。

本文分享自华为云社区《[Python图像处理] 一.图像处理基础知识及OpenCV入门函数》,作者: eastmount。

一.图像基础知识

图像都是由像素(pixel)构成的,即图像中的小方格,这些小方格都有一个明确的位置和被分配的色彩数值,而这些一小方格的颜色和位置就决定该图像所呈现出来的样子。像素是图像中的最小单位,每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。

图像通常包括二值图像、灰度图像和彩色图像。

1.二值图像

二值图像中任何一个点非黑即白,要么为白色(像素为255),要么为黑色(像素为0)。将灰度图像转换为二值图像的过程,常通过依次遍历判断实现,如果像素>=127则设置为255,否则设置为0。

2.灰度图像

灰度图像除了黑和白,还有灰色,它把灰度划分为256个不同的颜色,图像看着也更为清晰。将彩色图像转换为灰度图是图像处理的最基本预处理操作,通常包括下面几种方法:

(1) 浮点算法:Gray=R0.3+G0.59+B0.11
(2) 整数方法:Gray=(R30+G59+B11)/100
(3) 移位方法:Gray=(R28+G151+B77)>>8;
(4) 平均值法:Gray=(R+G+B)/3;(此程序采用算法)
(5) 仅取绿色:Gray=G;
(6) 加权平均值算法:根据光的亮度特性,公式: R=G=B=R0.299+G*0.587+B0.144

通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。改变象素矩阵的RGB值,来达到彩色图转变为灰度图。

3.彩色图像

彩色图像是RGB图像,RGB表示红、绿、蓝三原色,计算机里所有颜色都是三原色不同比例组成的,即三色通道。

二.OpenCV读写图像

本文主要使用Python2.7和OpenCV进行讲解,首先调用"pip install opencv-python"安装OpenCV库,如下图所示:

1.读入图像

OpenCV读图像主要调用下面函数实现:

img = cv2.imread(文件名,[,参数])
参数(1) cv2.IMREAD_UNCHANGED (图像不可变)
参数(2) cv2.IMREAD_GRAYSCALE (灰度图像)
参数(3) cv2.IMREAD_COLOR (读入彩色图像)
参数(4) cv2.COLOR_BGR2RGB (图像通道BGR转成RGB)

2.显示图像

显示图像调用函数如下:

cv2.imshow(窗口名, 图像名)

3.窗口等待

调用函数如下:

cv2.waitKey(delay)
键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入;参数>0表示等待delay毫秒;参数<0表示等待键盘单击。

4.删除所有窗口

调用函数如下:

cv2.destroyAllWindows() 删除所有窗口
cv2.destroyWindows() 删除指定的窗口

5.写入图片

调用函数如下:

retval = cv2.imwrite(文件地址, 文件名)

下面代码是读入图片并显示保存。

# -*- coding:utf-8 -*-
import cv2 #读取图片
img = cv2.imread("test.jpg") #显示图像
cv2.imshow("Demo", img) #等待显示
cv2.waitKey(0)
cv2.destroyAllWindows() #写入图像
cv2.imwrite("testyxz.jpg", img)

输出结果如下图所示,并且在文件夹下保存了一张名为“testyxz.jpg”的图像。

如果代码中没有watiKey(0)函数,则运行结果如下图所示:

同时,可以对代码进行升级,如下所示:

#无限期等待输入
k=cv2.waitKey(0)
#如果输入ESC退出
if k==27:
cv2.destroyAllWindows()

三.OpenCV像素处理

1.读取像素

灰度图像直接返回灰度值,彩色图像则返回B、G、R三个分量。注意OpenCV读取图像是BGR存储显示,需要转换为RGB再进行图像处理。

灰度图像:返回值 = 图像(位置参数)
eg: test=img[88,42]
彩色图像:返回值 = 图像[位置元素, 0 | 1 | 2 ] 获取BGR三个通道像素
eg: blue=img[88,142,0] green=img[88,142,1] red=img[88,142,2]

2.修改图像

修改图像如果是灰度图像则直接赋值新像素即可,彩色图像依次给三个值赋值即可。

灰度图像:
img[88,142] = 255
彩色图像:
img[88,142, 0] = 255
img[88,142, 1] = 255
img[88,142, 2] = 255
彩色图像:方法二
img[88,142] = [255, 255, 255]

下面代码是获取像素及修改的操作。

# -*- coding:utf-8 -*-
import cv2 #读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED)
test = img[88,142]
print test
img[88,142] = [255, 255, 255]
print test #分别获取BGR通道像素
blue = img[88,142,0]
print blue
green = img[88,142,1]
print green
red = img[88,142,2]
print red #显示图像
cv2.imshow("Demo", img) #等待显示
cv2.waitKey(0)
cv2.destroyAllWindows() #写入图像
cv2.imwrite("testyxz.jpg", img)

输出结果如下所示:

[158 107 64]
[255 255 255]
255
255
255

下面代码是将行为100到200、列150到250的像素区域设置为白色。

# -*- coding:utf-8 -*-
import cv2 #读取图片
img = cv2.imread("test.jpg", cv2.IMREAD_UNCHANGED) #该区域设置为白色
img[100:200, 150:250] = [255,255,255] #显示图像
cv2.imshow("Demo", img) #等待显示
cv2.waitKey(0)
cv2.destroyAllWindows() #写入图像
cv2.imwrite("testyxz.jpg", img)

运行结果如下图所示:

希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。再次感谢您的关注,初来在华为云社区分享知识,初来乍到,还请多多指教。

本文摘录自eastmount X华为云开发者社区联合出品的电子书《从零到一 • Python图像处理及识别》。

点击免费下载电子书《从零到一 • Python图像处理及识别》

点击关注,第一时间了解华为云新鲜技术~

打基础丨Python图像处理入门知识详解的更多相关文章

  1. Python基础知识详解 从入门到精通(七)类与对象

    本篇主要是介绍python,内容可先看目录其他基础知识详解,欢迎查看本人的其他文章Python基础知识详解 从入门到精通(一)介绍Python基础知识详解 从入门到精通(二)基础Python基础知识详 ...

  2. Python字符串切片操作知识详解

    Python字符串切片操作知识详解 这篇文章主要介绍了Python中字符串切片操作 的相关资料,需要的朋友可以参考下 一:取字符串中第几个字符 print "Hello"[0] 表 ...

  3. RabbitMQ,Apache的ActiveMQ,阿里RocketMQ,Kafka,ZeroMQ,MetaMQ,Redis也可实现消息队列,RabbitMQ的应用场景以及基本原理介绍,RabbitMQ基础知识详解,RabbitMQ布曙

    消息队列及常见消息队列介绍 2017-10-10 09:35操作系统/客户端/人脸识别 一.消息队列(MQ)概述 消息队列(Message Queue),是分布式系统中重要的组件,其通用的使用场景可以 ...

  4. Python数据类型及其方法详解

    Python数据类型及其方法详解 我们在学习编程语言的时候,都会遇到数据类型,这种看着很基础也不显眼的东西,却是很重要,本文介绍了python的数据类型,并就每种数据类型的方法作出了详细的描述,可供知 ...

  5. Python对Excel操作详解

      Python对Excel操作详解 文档摘要: 本文档主要介绍如何通过python对office excel进行读写操作,使用了xlrd.xlwt和xlutils模块.另外还演示了如何通过Tcl   ...

  6. python基础之函数详解

    Python基础之函数详解 目录 Python基础之函数详解 一.函数的定义 二.函数的调用 三.函数返回值 四.函数的参数 4.1 位置参数 4.2 关键字参数 实参:位置实参和关键字参数的混合使用 ...

  7. python之OS模块详解

    python之OS模块详解 ^_^,步入第二个模块世界----->OS 常见函数列表 os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows ...

  8. python之sys模块详解

    python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...

  9. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

随机推荐

  1. 5分钟了解二叉树之LeetCode里的二叉树

    有读者反馈,现在谁不是为了找工作才学的数据结构,确实很有道理,是我肤浅了.所以为了满足大家的需求,这里总结下LeetCode里的数据结构.对于我们这种职场老人来说,刷LeetCode会遇到个很尴尬的问 ...

  2. 为什么操作 DOM 慢?

    DOM本身是一个js对象, 操作这个对象本身不慢, 但是操作后触发了浏览器的行为, 如repaint和reflow等浏览器行为, 使其变慢

  3. spring源码-ioc容器周期

    Spring容器的refresh 创建刷新:   1-prepareRefresh刷新前的预处理: initPropertySources 初始化一些属性配置,原来是空的,子类自定义的属性设置方法 g ...

  4. 什么是 rabbitmq ?

    采用 AMQP 高级消息队列协议的一种消息队列技术,最大的特点就是消费并不需 要确保提供方存在,实现了服务之间的高度解耦

  5. Java 中 interrupted 和 isInterrupted 方法的区别?

    interrupt interrupt 方法用于中断线程.调用该方法的线程的状态为将被置为"中断"状态. 注意:线程中断仅仅是置线程的中断状态位,不会停止线程.需要用户自己去监 视 ...

  6. 什么是 AQS ?

    AQS 是 AbustactQueuedSynchronizer 的简称,它是一个 Java 提高的底层同步工具类,用一个 int 类型的变量表示同步状态,并提供了一系列的 CAS 操作来管理这个同步 ...

  7. Redis 集群的主从复制模型是怎样的?

    为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所 以集群使用了主从复制模型,每个节点都会有 N-1 个复制品.

  8. Java 中,Comparator 与 Comparable 有什么不同?

    Comparable 接口用于定义对象的自然顺序,而 comparator 通常用于定义用户 定制的顺序.Comparable 总是只有一个,但是可以有多个 comparator 来定义 对象的顺序.

  9. html 不常用标签介绍

    文本元素 <wbr> 如果单词太长,或者您担心浏览器会在错误的位置换行,那么您可以使用 <wbr> 元素来添加 Word Break Opportunity(单词换行时机).英 ...

  10. CSS揭秘之《多重边框》

    1.box-shadow还接受第四个参数(称作"扩张半径"), 通过指定正值或负值, 可以让投影面积加大或者减小2.如果我们想要一道实线边框其实也是可以通过box-shadow来模 ...