第二章:图像处理基础

第二章:图像处理基础操作

  • 一、图像的基本表示方法:
    • 1. 二值图像:
    • 2. 灰度图像:
    • 3. 彩色图像:
  • 二、像素处理:
    • 1. 二值图像及灰度图像:
    • 2.彩色图像:
    • 3. 使用numpy.array访问像素:
  • 三、感兴趣区域(ROI):
  • 四、通道操作:
    • 1. 通道拆分:
    • 2. 通道合并:
  • 五、获取图像属性:

本章主要介绍:

  • 图像的基本表示方法
  • 像素的访问和操作
  • 感兴趣区域的处理
  • 通道处理

等知识点。需要注意的是,使用面向Python的OpenCV必须熟练掌握Numpy库,尤其是Numpy.array库,Numpy.array库是python处理图像的基础。

一、图像的基本表示方法:

图像的基本表示方法有:

  • 二值图像
  • 灰度图像
  • 彩色图像

1. 二值图像:

二值图像是指仅包含黑色和白色两种颜色的图像。

计算机中,通过矩阵来表示和处理图像。例如下图一个A的图像,计算机在处理该图像时,会首先将其划分为一个个的小方块,即像素点,每一个像素点都是一个独立的处理单元。然后,将其中白色的像素点置为1,黑色的像素点置为0,用于后续的存储和处理操作。

在这里插入图片描述

2. 灰度图像:

二值图像表示起来简单方便,但是因为其仅有黑白两种颜色,所表示的图像不够细腻。如果需要表示更多的细节,就需要使用更多的颜色。

例如,下图的灰度图像:
在这里插入图片描述在这里插入图片描述

通常,计算机会将灰度处理为256个灰度级,用区间[0, 255]来表示。其中255表示纯白色,0表示纯黑色,其余的数值表示从纯白色到纯黑色之间前不同级别的灰度。

用于表示256个灰度级的数值0-255,正好可以用一个字节(8个2进制位)来表示。如下图是部分二进制值所对应的十进制值:

在这里插入图片描述

有些情况下,也会使用8位二进制来表示一幅二值图像。这种情况下,255表示白色,0表示黑色,图像中只存在255和0。

3. 彩色图像:

​ 相比二值图像和灰度图像,彩色图像是更常见的一类图像。神经生理学实验发现,在视网膜上存在三种不同的颜色感受器,能够感受三种不同的颜色:红色、绿色和蓝色,即三基色。自然界中常见的各种色光都可以通过将三基色按照一定的比例混合构成。除此之外,从光学角度出发,可以将颜色解析为主波长、纯度、明度等。从心理学和视觉角度出发,可以将颜色解析为色调、饱和度、亮度等。通常,我们将上述方式采用不同的方式来表述颜色的模式称为色彩空间,或者颜色空间、颜色模式。

​ 虽然,不同的色彩空间具有不同的表示方式,但是各种色彩空间之间可以根据相应的公式进行转换。

​ 例如,在RGB色彩空间中,存在R通道、G通道、B通道,共三个通道。每个色彩通道值的方位都在[0, 255]之间。因此,通常用一个三维数组来表示一幅RGB色彩空间的彩色图像。注意,在OpenCV中,通道的顺序是B-G-R。
在这里插入图片描述

二、像素处理:

像素是图像构成的基本单位,像素处理是图像处理的基本操作,可以通过位置索引的形式对图像内的元素镜像访问、处理。

1. 二值图像及灰度图像:

​ 在OpenCV中,最小的数据类型是无符号的8位数。因此,在OpenCV中实际是并没有二值图像这种数据类型,二值图像经常是通过处理得到的特殊的灰度图像,使用0表示黑色,使用255表示白色。

​ 通过前面的分析可知,在计算机中,图像就是一个由像素点组成的矩阵。在面向Python 的OpenCV中,图像就是Numpy中的数组。一个OpenCV灰度图像就是一个二维数组,可以使用表达式访问其中的像素值。例如:可以使用image[0, 0]访问图像image第0行第0列未知上的像素点。

示例: 读取一个灰度图像,并对其像素进行访问、修改:

import cv2
img = cv2.imread('lena.bmp', 0)
cv2.imshow('before', img)
for i in range(10, 100):for j in range(80, 100):img[i, j] = 255
cv2.imshow('after', img)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

2.彩色图像:

RGB模式的彩色图像在读入到OpenCV中进行处理时,会按照行方向依次读取该RGB图像的 B通道、G通道、R通道的像素点,并将像素点以行为单位存储在ndarray的列中。例如,有一幅大小为R行×C列的原始RGB图像,其在OpenCV内衣BGR模式的三维数组形式存储。

在这里插入图片描述

可以使用表达式访问数组内的值。例如,可以使用image[0, 0, 0] 访问图像image第0行第0列像素点的B通道。

  • 第1个索引表示第0行
  • 第2个索引表示第0列
  • 第3个索引表示第0个颜色通道

示例: 读取一幅彩色图像,并对其像素进行访问、修改。

import cv2
img = cv2.imread('lena512color.tiff')
cv2.imshow('before', img)
# 白色
for i in range(0, 50):for j in range(0, 100):for k in range(0, 3):img[i, j, k] = 255
# 灰色
for i in range(50, 100):for j in range(0, 100):img[i, j] = [128, 128, 128]
# 黑色
for i in range(100, 150):for j in range(0, 100):img[i, j] = 0
cv2.imshow('after', img)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

3. 使用numpy.array访问像素:

numpy.array提供了item()和itemset()行数来访问和修改像素值,而且这两个函数都是经过优化处理的,能够大幅度提高处理效率。在访问和修改像素点的值时,利用numpy.array提供的函数要比直接使用索引快得多,同时这两个函数的可读性也更好。

  • 二值图像及灰度图像:
    可以将二值图像理解为特殊的灰度图像。

    • item():访问像素点,语法:item(行,列)
    • item():修改像素值,语法:itemset(索引值,新值)

    示例: 读取一幅灰度图像,并对其进行像素值访问及修改。

    import cv2
    img = cv2.imread('../lena.bmp', 0)
    print('读取像素点img.item(3, 2)=', img.item(3, 2))
    img.itemset((3, 2), 255)
    print('修改后像素点img.item(3, 2)=', img.item(3, 2))
    cv2.imshow('before', img)
    for i in range(10, 200):for j in range(80, 300):img.itemset((i, j), 255)
    cv2.imshow('after', img)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

在这里插入图片描述

  • 彩色图像:

  • 同样可以使用item()函数和itemset()函数来访问和修改彩色图像的像素值,过程与操作灰度图像 相似。不同的是需要补充通道信息。

    • item():访问EGB模式图像的像素值。语法:item(行,列, 通道)

    • itemset():修改RGB模式图像像素值。语法:itemset(三元组索引值,新值)

      需要注意,针对RGB图像的访问,必须同时指定行、列以及通道,例如img.item(a, b, c)。仅指定行和列是不可以的。

    示例: 读取已否彩色图像,并对其进行像素访问、修改

    import cv2
    img = cv2.imread('lena512color.tiff')
    cv2.imshow('before', img)
    print('访问img.item(0, 0, 0) = ', img.item(0, 0, 0))
    # 白色
    for i in range(0, 50):for j in range(0, 100):for k in  range(0, 3):img.itemset((i, j, k), 255)
    cv2.imshow('after', img)
    print('修改后端img.item(0, 0, 0) = ', img.item(0, 0, 0))
    cv2.waitKey()
    cv2.destroyAllWindows()
    

在这里插入图片描述

访问img.item(0, 0, 0) = 125
修改后端img.item(0, 0, 0) = 255

三、感兴趣区域(ROI):

在图像处理过程中,我们可能会对图像的摸一个特定区域感兴趣,该区域被称为感兴趣区域(ROI)。在设定感兴趣区域ROI后,就可以对该区域进行整体操作。例如,将一个感兴趣区域A赋值给变量B后,可以将该变量B赋值给另外一个区域C,从而达到在区域C内复制区域A的目的。

示例1: 假设当前图像名称为img,图中的数字分别表示行号和列号。那么,图像中的黑色ROI可以表示为img[200:400, 200:400],

在这里插入图片描述

通过一下语句,能够将图中黑色ROI复制到该区域右侧:

a = img[200:400, 200:400]

img[200:400, 600:800] = a

在这里插入图片描述

示例2: 获取图像lena的脸部信息,并将其显示出来。

import cv2
a = cv2.imread('lena512color.tiff', cv2.IMREAD_UNCHANGED)
face = a[220: 400, 250: 350]
cv2.imshow('original', a)
cv2.imshow('face', face)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

示例3: 对lena图像脸部进行打码

import cv2
import numpy as np
a = cv2.imread('../lena512color.tiff', cv2.IMREAD_UNCHANGED)
cv2.imshow('original', a)
face = np.random.randint(0, 256, (180, 100, 3))
a[220: 400, 250: 350] = face
cv2.imshow('result', a)
cv2.waitKey()
cv2.destroyAllWindows()

在这里插入图片描述

四、通道操作:

在RGB图像中,图像由R通道、G通道、B通道三个通道构成的。需要注意的是,在OpenCV中,通道是按照B通道-G通道-R通道的顺序存储的。在图像处理过程中,可以根据需要对图像进行通道拆分和通道合并。

1. 通道拆分:

针对RGB图像,可以分别拆分出其R通道、G通道、B通道。在OpenCV中,即可以通过索引的方式拆分通道,也可以通过函数的方式拆分通道。

  • 通过索引拆分通道:

    通过索引的方式,可以直接将各个通道从图像内提取出来。如:针对OpneCV中的BGR图像img

    • b = img[ : , : , 0]
    • g = img[ : , : , 1]
    • r = img[ : , : , 2]

    示例: 编写程序,演示图像通道才分及通道值变换对彩色图像的影响。

    import cv2
    lena = cv2.imread('lena512color.tiff')
    cv2.imshow('lena1', lena)
    b = lena[:, :, 0]
    g = lena[:, :, 1]
    r = lena[:, :, 2]
    cv2.imshow('b', b)
    cv2.imshow('g', g)
    cv2.imshow('r', r)
    lena[:, :, 0] = 0
    cv2.imshow('lenab0', lena)
    lena[:, :, 1] = 0
    cv2.imshow('lenabogo', lena)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

在这里插入图片描述

  • 通过函数拆分通道:

    函数cv2.split()能够拆分图像的通道。如,可以使用以下语句拆分彩色BGR图像img,得到图像的B,G,R通道。

    • b, g, r = cv2.split(img)

      b = cv2.split(img)[0]

      g = cv2.split(img)[1]

      r = cv2.split(img)[2]

    示例: 使用函数cv2.split()拆分图像通道

    import cv2
    lena = cv2.imread('../lena512color.tiff')
    b, g, r = cv2.split(lena)
    cv2.imshow('B', b)
    cv2.imshow('G', g)
    cv2.imshow('R', r)
    cv2.waitKey()
    cv2.destroyAllWindows()
    

在这里插入图片描述

2. 通道合并:

通道合并是通道拆分的逆过程,通过合并通道可以将三个通道的灰度图像构成一幅彩色图像。函数cv2.merge()可以实现图像通道的合并,如有B, G, R三个通道图像,使用函数cv2.merge()将其合并为一幅BGR三通道的彩色图像。其实现语句为:bgr_img = cv2.merge([b, g, r])

示例: 使用函数cv2.merge()合并通道。

import cv2
lena = cv2.imread('../lena512color.tiff')
b, g, r = cv2.split(lena)
bgr = cv2.merge([b, g, r])
rgb = cv2.merge([r, g, b])
cv2.imshow('lena', lena)
cv2.imshow('bar', bgr)
cv2.imshow('rgb', rgb)
cv2.waitKey()
cv2.destroyAllWindows() 

在这里插入图片描述

五、获取图像属性:

在图像处理过程中,经常需要获取图像的属性,如图像的大小、类型等。这里介绍几个常用的属性

  • shape:如果是彩色图像,则返回包含行数、列数、通道数的数组;如果是二值图像或者灰度图像,则仅返回行数和列数。通过该属性的返回值是否包含通道数,可以判断图像是灰度图像还是彩色图像。
  • size:返回图像的像素数目。其值为"行数×列数×通道数",灰度图像挥着二值图像通道数为1
  • dtype:返回图像的数据类型

示例:

import cv2
gray = cv2.imread('../lena.bmp', 0)
color = cv2.imread('../lena512color.tiff')
print('图像gray属性')
print('gray.shape=', gray.shape)
print('gray.size=', gray.size)
print('gray.dtype=', gray.dtype)
print('图像color属性')
print('color.shape=', color.shape)
print('color.size=', color.size)
print('color.dtype=', color.dtype)
  • 终端输出:

    图像gray属性
    gray.shape= (512, 512)
    gray.size= 262144
    gray.dtype= uint8
    图像color属性
    color.shape= (512, 512, 3)
    color.size= 786432
    color.dtype= uint8

该文章内容参考总结自《OpenCV轻松入门》这本书,详细内容可以参考这本书。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/400655.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《Head First设计模式》 读书笔记16 其余的模式(二) 蝇量 解释器 中介者

《Head First设计模式》 读书笔记16 其余的模式(二) 蝇量 解释器 中介者 蝇量(Flyweight Pattern) 如想让某个类的一个实例能用来提供许多“虚拟实例”,就使用蝇量模式(Flyweight Pattern) 。 例…

洛谷P1525 关押罪犯

P1525 关押罪犯 题目描述 S 城现有两座监狱,一共关押着N 名罪犯,编号分别为1~N。他们之间的关系自然也极不和谐。很多罪犯之间甚至积怨已久,如果客观条件具备则随时可能爆发冲突。我们用“怨气值”(一个正整数值)来表示…

【机器视觉学习笔记】Hough变换直线检测(C++)

目录源码效果平台&#xff1a;Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文源码摘自OpenCV2马拉松第22圈——Hough变换直线检测原理与实现 源码 #include <opencv2\opencv.hpp> #include <iostream> #include <opencv2\imgproc\types_c.h> #in…

第3章:图像运算

第3章&#xff1a;图像运算one. 图像加法运算&#xff1a;1. 加号运算符"":2. cv2.add()函数&#xff1a;two. 图像加权和&#xff1a;three. 按位逻辑运算&#xff1a;1. 按位与运算&#xff1a;2. 按位或运算&#xff1a;3.按位非运算&#xff1a;4. 按位异或运算&…

JMS中的消息通信模型

1. MQ简介&#xff1a; 消息队列&#xff08;Message Queue&#xff0c;简称MQ&#xff09;,是应用程序与应用程序之间的一种通信方法。应用程序通过发送和检索出入列队的针对应用程序的数据 - 消息来通信&#xff0c;而无需专用连接来链接它们。程序之间通过在消息中发送数据进…

【机器视觉学习笔记】最近邻插值实现图片任意角度旋转(C++)

目录原理源码RotateImage主函数效果完整源码速度优化源码优化效果平台&#xff1a;Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 本文算法改进自图形算法与实战&#xff1a;6.图像运动专题&#xff08;5&#xff09;图像旋转-基于近邻插值的图像旋转 —— 进击的CV 原理…

UGUI的优点新UI系统

UGUI的优点新UI系统 第1章 新UI系统概述 UGUI的优点新UI系统&#xff0c;新的UI系统相较于旧的UI系统而言&#xff0c;是一个巨大的飞跃&#xff01;有过旧UI系统使用体验的开发者&#xff0c;大部分都对它没有任何好感&#xff0c;以至于在过去的很长一段时间里&#xff0c;大…

【探索HTML5第二弹05】响应式布局(中),一步一步响应式布局

前言 前天初步探究了一次响应式布局&#xff0c;虽然花了一天功夫&#xff0c;做出来的东西还是不行&#xff0c;在此我还是认为要做响应式布局设计应该先行&#xff0c;应该先制作3个以上的设计图出来&#xff0c;但是对于手机来说&#xff0c;图片流量也是个问题&#xff0c;…

通过使用CSS字体阴影效果解决hover图片时显示文字看不清的问题

1.前言 最近需要加入一个小功能&#xff0c;在鼠标越过图片时&#xff0c;提示其大小和分辨率&#xff0c;而不想用增加属性title来提醒&#xff0c;不够好看。然而发现如果文字是一种颜色&#xff0c;然后总有概率碰到那张图上浮一层的文字会看不到&#xff0c;所以加入文字字…

第4章:色彩空间类型转换

第四章&#xff1a;色彩空间类型转换one. 色彩空间基础知识&#xff1a;1. GRAY色彩空间&#xff1a;2. XYZ色彩空间3. YCrCb色彩空间3. HSV色彩空间4. HLS 色彩空间5. CIEL * a * b *色彩空间6. CIEL * u * v *色彩空间7. Bayer色彩空间two. 类型转换函数&#xff1a;three. 类…

【机器视觉学习笔记】双线性插值实现图片任意角度旋转(C++)

目录原理源码RotateImage_BilinearInterpolation主函数效果与最近邻插值比较原图最近邻插值效果&#xff08;局部&#xff09;双线性插值效果&#xff08;局部&#xff09;完整源码平台&#xff1a;Windows 10 20H2 Visual Studio 2015 OpenCV 4.5.3 原理 如图所示&#xff0…

第5章 - 几何变换

第五章-几何变换one. 缩放:two. 翻转&#xff1a;three. 仿射&#xff1a;1. 平移&#xff1a;2. 旋转&#xff1a;3. 更多复杂的仿射变换&#xff1a;four. 透视&#xff1a;five. 重映射&#xff1a;1. 映射参数的理解&#xff1a;2. 复制&#xff1a;3. 绕x轴旋转&#xff1…

安装设置Android Studio Win7安装

发一下牢骚和主题无关&#xff1a; 让人等待已久的Google I/O 2013 大会没有给我们带来Android5.0&#xff0c;也没有带来Adnroid4.3等等&#xff0c;但带来了Android Studio&#xff0c;虽说是预览版&#xff0c;又是基于Intellij IDEA&#xff0c; 但是也无不让开辟者们高兴。…

【树莓派学习笔记】一、烧录系统、(无屏幕)配置Wifi和SSH服务

目录系统镜像的准备格式化TF卡烧录镜像配置Wifi开启SSH服务第一次开机平台&#xff1a;树莓派3B 版本&#xff1a; 2021-05-07-raspios-buster-armhf 系统镜像的准备 树莓派资源里有许多资源&#xff0c;包括我们要用到的镜像。 格式化TF卡 将TF卡格式化为FAT32格式。 …

第6章-阈值处理

第六章-阈值处理one. threshold函数&#xff1a;1. 二值化阈值处理&#xff08;cv2.THRESH_BINARY&#xff09;&#xff1a;2. 反二值化阈值处理(cv2.THRESH_BINARY_INV)3. 截断阈值化处理(cv2.THRESH_TRUNC)4. 超阈值零处理(cv2.THRESH_TOZERO_INV)5.低阈值零处理(cv2.THRESH_…

【树莓派学习笔记】二、(无屏幕)SSH远程登录、图形界面及系统配置

目录确定树莓派LAN IP使用PuTTY登陆带图形界面的远程登陆Xming方案VNC Server 方案系统配置换源(可选)备份原文件查询系统版本编辑sources.list文件同步更新源更新软件包重启树莓派固定LAN IP平台&#xff1a;树莓派3B 版本&#xff1a; 2021-05-07-raspios-buster-armhf 确定…

Centos7完全分布式搭建Hadoop2.7.3

(一&#xff09;软件准备 1&#xff0c;hadoop-2.7.3.tar.gz&#xff08;包&#xff09; 2,三台机器装有cetos7的机子 &#xff08;二&#xff09;安装步骤 1&#xff0c;给每台机子配相同的用户 进入root : su root 创建用户s: useradd s 修改用户密码&#xff1a;passwd s 2…

第7章:图像的平滑处理

第7章&#xff1a;图像的平滑处理一、均值滤波&#xff1a;二、方框滤波&#xff1a;三、高斯滤波&#xff1a;四、中值滤波五、双边滤波&#xff1a;六、2D卷积​ 图像的平滑处理是在尽量图像原有信息的情况下&#xff0c;过滤掉图像内部的噪声。由于图像平滑处理的同时通常伴…

【树莓派学习笔记】三、点亮一个LED灯(C语言 - WiringPi、Python - RPi.GPIO/GPIO Zero、bash脚本)

目录C语言WiringPiPythonRPi.GPIOGPIO Zerobash脚本平台&#xff1a;树莓派3B 版本&#xff1a; 2021-05-07-raspios-buster-armhf 若GPIO输出为3.3V 采用压降为1.7V的红色LED灯 设工作电流为15mA&#xff0c;则限流电阻取≥(3.3 - 1.7)/0.015 106.67欧较为安全。 C语言 Wi…

OpenStack 之Nova添加扩展API流程,附带资源的查找功能

例子中涉及到SQLAlchemy 得相关操作&#xff0c;可以参考 上一随笔 Openstack 中规定&#xff0c;扩展openstack得api有两种方式 创建新的WSGI 资源扩展原有得WSGI资源得控制器&#xff08;我得理解是&#xff0c;接受到API请求后&#xff0c;具体得响应逻辑&#xff09;这两种…