2 用python进行OpenCV实战之图像基本知识

前言

在这一节,我们将学习图像的基本构成单元——像素,我们将详细的探讨什么是像素?像素是如何使用来构成图像的?然后学习如何通过OpenCV来获取和操纵像素。

1 什么是像素

所有的图像都包含一组像素,像素是图像的原始构建块。 没有比像素更细的单位了。
通常,我们将像素认为是在我们的图像给定位置出现的光的颜色或者强度,如果我们将图像考虑成一个网格,在网格中的每个方块都包含一个单一的像素。例如,我们假设有一个分辨率是500*300的图像,这就意味着我们的图像被分成一个关于像素的网格,这个网格有500个行,300个列,综上可知,总共有500*300=150000个像素在这张图片中。
像素主要有两种表达形式:灰度模式和彩色模式。在一张灰度图片中,每个像素有一个从0至255{[0,255]}的值,其中0表示“纯黑色”,255表示“纯白色”,在0和255之间的值变现成不同深浅的灰色,当值靠近0时,图像更暗,当值靠近255时,图像更亮。
彩色模式的图片通常用RGB颜色空间来表示(R for red, G for green, B for blue),还有一些其他的模式比如CMY,但是在这里我们先不讨论。
我们以(red, green, blue)的形式来表示RGB元组,这个元组就表示了我们的颜色,其中这三种颜色的值用在[0,255]之间的整数值表示,所以我们通常用unsigned int类型来表示每个颜色的强度。
为了构成白色,我们需要用(255, 255, 255)来表示,为了得到黑色,我们需要用(0, 0, 0)来表示,红(255, 0, 0),绿(0, 255, 0),蓝(0, 0, 255).
RGB配色表
色光三原色

2 图像坐标系概述

正如我们之前所提到的,我们将一张图片以像素网格的形式表示,我们想象一下假设我们的图片为一张图表纸,图像的左上角为原点。
图像坐标系

3 获取和操纵像素

上一节中,我们从磁盘中读取了图片,然后将它转换了格式再存储到了磁盘中,在这一节我们将对如何获取和操纵图像的像素进行实战,建立

getting_and_setting.py

3.1 代码

from __future__ import print_function #1
import argparse #2
import cv2 #3

ap = argparse.ArgumentParser() #4
ap.add_argument("-i", "--image", required=True,
                help="Path to the image") #5
args = vars(ap.parse_args()) #6

image = cv2.imread(args["image"]) #7
cv2.imshow("Original", image) #8

(b, g, r) = image[0, 0] #9
print("Pixel at (0, 0) - Red: {}, Green: {}, Blue: {}".format(r, g, b)) #10

image[0, 0] = (0, 0, 255) #11
(b, g, r) = image[0, 0] #12
print("Pixel at (0, 0) - Red: {}, Green: {}, Blue: {}".format(r, g, b)) #13

corner = image[0:200, 0:100] #14
cv2.imshow("corner1", corner) #15

image[0:200, 0:100] = (0, 255, 0) #16
cv2.imshow("update", image) #17
cv2.waitKey(0) #18

3.2 代码详细解释

#1-6:
关于这段代码在第一节中已经进行过详细解释了,主要是为了导包,命令行参数的处理

#7-8:
展示原始图片

#9:
在第一节中,就曾经提到过OpenCV是用NumPy数组来表示图像的,我们也可以将这种表示看成是一种矩阵表示,为了获取像素,我们需要应用我们所感兴趣的x,y坐标,从中我们可以得到一个表示(r,g,b)的元组,然而,我们需要注意的是:在OpenCV中是以逆序存储RGB通道到的,即我们通常以red,green,blue的顺序来记忆,但是OpenCV则是以blue,green,red的顺序来储存的.

(b, g, r) = image[0, 0]

通过获得图像(0,0)处的像素,并将它赋值给一个三元组,我们可以再次看出OpenCV以逆序存取RGB像素,所以当我们在元组中得到每个元素时候,我们需要以BGR的顺序来获取

#10:
输出RGB每个通道的值到终端。可以看出我们获取像素值的方法非常简单,而这一切都要归功于NumPy,它替我们做了一系列的复杂工作。

#11:
我们操纵在左上角的像素,即在(0,0)处的像素,我们给他赋值(0,0,255),如果我们将它以RGB的格式来读的话,我们认为:red值是0,green值是0,blue值是255,所以我们将得到纯蓝色。然而,正如我们之前所提到的OpenCV是以BGR的格式存储像素的而不是RGB格式,所以我们实际上得到的是:red值是255,green值是0,blue值是0,因此我们得到的是一个纯红色而不是纯蓝色。

#12,13:
通过得到在(0,0)像素点的BGR颜色值,然后将它们以RGB的形式输出

#14
获取以及操纵单一的像素点是相当简单的,那如果使用NumPy的数组分割能力得到图像的一块长方形区域呢?

corner = image[0:200, 0:100] #14

在第一节我们介绍过image的数组里的第一个参数是高即y,第二个参数是宽即x,所以corner将得到一个100*200大小的长方形区域,而这个区域即为图像的左上角区域。

#15:
将corner以“Corner”的名称显示出来

#16:
将左上角的区域用(0,255,0)即绿色来表示,实现了改变一整块区域的像素值的目的。

#17:
以“Updated”的名称显示图像

#18:
cv2.waitKey()表示暂停脚本的执行直到在键盘输入一个按键,用“0”作为参数表示可以使用任何按键作为继续脚本执行的按钮。

效果展示

显示效果


转载请注明出处:
CSDN:楼上小宇__home:http://http://blog.csdn.net/sty945
简书:楼上小宇:http://www.jianshu.com/u/1621b29625df

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值