OpenCV是进行图像处理的工具,也是计算机视觉领域近十几年不断发展和完善的产物。面对这个已基本成熟的开源库知识体系,我们新生代有必要不断地总结、回顾,以新的视角快速融入计算机视觉的奥秘世界。

从这篇随笔开始,让我们踏上重新回顾OpenCV进行图像处理的奇妙之旅。

1  图像处理基础

1.1  图像的读入、显示、保存

#图像读入
import cv2
img1 = cv2.imread(r'E:/python_opencv/tupian.jpg',0)
#图像显示
cv2.imshow('tupian',img1)
k = cv2.waitKey()
#图像保存
cv2.imwrite('tupian,jpg',img1)

1.2  图像的基本表示方法

分为二值图像、灰度图像、彩色图像 这三种表示方法。

二值图像:0和1表示像素点颜色,0为黑色,1为白色。

灰度图像:256个灰度级,用数值[0,255]表示,0为黑色,1为白色。

彩色图像:RGB色彩空间表示红、绿、蓝三种通道,数值均为[0,255]。但是在opencv中用BGR色彩空间表示。

不同的表示方法和色彩空间之间可以互相转换。

1.3  像素处理

像素是构成一幅图像的基本组成单位。

二值图像和灰度图像:img[0,2]表示第0行第2列的像素点。

彩色图像:opencv里img[0,2]表示第0行第2列上B、G、R三个通道的像素值,img[0,2,2]表示第0行第2列上第2个通道R的像素值。

注1:可以使用二层或三层循环嵌套,对某区域内像素值整体修改,如:

for i in range(0,50):          #i表示像素的行数
for j in range(0,100): #j表示像素的行数
for k in range(0,3): #k表示通道数
img[i,j,k]=255 #该区域的像素值均修改为255

注2:使用Numpy库中的zeros()函数可以生成一个元素值都为0的数组,如:

import numpy as np
img = np.zeros((3,5,3),dtpye=np.uint8)

1.4  使用numpy访问像素

numpy模块中提供了item()访问像素值,itemset()修改像素值

item(i,j)或item(i,j,k)

itemset((i,j),a) 或 itemset((i,j,k),a)   i,j为行和列,k为彩色图片中的通道,a为新值。如:

print('img.item(3,2,2)=',img.item(3,2,2))   #读取原像素值
img.itemset((3,2,2),255) #将第3行第2列R通道的像素值修改为255

1.5  感兴趣区域(Region of Interset, ROI)

如果需要使用一张图片的某区域,可以将其定为感兴趣区域(ROI),然后就能对其整体进行操作。

A = img1[10:30,50:100]    #将img1的第10-30行像素、50-100列像素设定为ROI区域
img2[20:40,300:350] = A #将该ROI区域赋给img2的第20-40行像素、300-350列像素

1.6  通道操作

对通道进行操作分为通道拆分和通道合并。

(一)通道拆分:

将BGR图像中的三个通道分别拆分出来。分为索引拆分方法和函数拆分方法。

索引拆分:

#拆分为B、G、R三个通道
B = img[:,:,0]
G = img[:,:,1]
R = img[:,:,2]

函数拆分:

B,G,R = cv2.split(img)

(二)通道合并:

使用cv2.merge()函数将三个通道的灰度图像构成一幅彩色图像。

bgr = cv2.merge([b,g,r])  

1.7  获取图像属性

获取图像常用的属性,如大小、类型等。

shape 返回图像行数、列数、通道数

size 返回图像像素数

dtype 返回图像的数据类型

print('img.shape=',img.shape)   #shape 返回图像行数、列数、通道数
print('img.size=',img.size) #size 返回图像像素数
print('img.dtype=',img.dtype) #dtype 返回图像的数据类型

这次内容就分享到这里了,下次继续更新第2章图像的运算,希望与各位老师和小伙伴们交流学习~

【图像处理】使用OpenCV进行图像处理教程(一)的更多相关文章

  1. 【图像处理】OpenCV+Python图像处理入门教程(四)几何变换

    这篇随笔介绍使用OpenCV进行图像处理的第四章 几何变换. 4  几何变换 图像的几何变换是指将一幅图像映射到另一幅图像内.有缩放.翻转.仿射变换.透视.重映射等操作. 4.1  缩放 使用cv2. ...

  2. 【图像处理】OpenCV+Python图像处理入门教程(五)阈值处理

    这篇随笔介绍使用OpenCV进行图像处理的第五章 阈值处理. 5  阈值处理 阈值是指像素到达某临界值.阈值处理表示像素到达某临界值后,对该像素点进行操作和处理. 例如:设定一幅图像素阈值为200,则 ...

  3. 【图像处理】OpenCV+Python图像处理入门教程(六)图像平滑处理

    相信很多小伙伴都听过"滤波器"这个词,在通信领域,滤波器能够去除噪声信号等频率成分,然而在我们OpenCV中,"滤波"并不是对频率进行筛选去除,而是实现了图像的 ...

  4. 【图像处理】OpenCV+Python图像处理入门教程(七)图像形态学操作

    图像形态学主要从图像内提取分量信息,该分量信息通常对表达图像的特征具有重要意义.例如,在车牌号码识别中,能够使用形态学计算其重要特征信息,在进行识别时,只需对这些特征信息运算即可.图像形态学在目标视觉 ...

  5. Atitit 图像处理 调用opencv 通过java  api   attilax总结

    Atitit 图像处理 调用opencv 通过java  api   attilax总结 1.1. Opencv java api的支持 opencv2.4.2 就有了对java api的支持1 1. ...

  6. Python图像处理库:Pillow 初级教程

    Python图像处理库:Pillow 初级教程 2014-09-14 翻译 http://pillow.readthedocs.org/en/latest/handbook/tutorial.html ...

  7. windows平台下基于QT和OpenCV搭建图像处理平台

        在之前的博客中,已经分别比较详细地阐述了"windows平台下基于VS和OpenCV"以及"Linux平台下基于QT和OpenCV"搭建图像处理框架,并 ...

  8. 海康威视摄像头+OpenCV+VS2017 图像处理小结(二)

    海康威视摄像头+OpenCV+VS2017 图像处理小结(二) https://blog.csdn.net/o_ha_yo_yepeng/article/details/79825648 目录 一.海 ...

  9. Python图像处理丨OpenCV+Numpy库读取与修改像素

    摘要:本篇文章主要讲解 OpenCV+Numpy 图像处理基础知识,包括读取像素和修改像素. 本文分享自华为云社区<[Python图像处理] 二.OpenCV+Numpy库读取与修改像素> ...

随机推荐

  1. 2019牛客多校 Round7

    Solved:5 Rank:296 E Find the median (线段树) 题意:最开始一个空的数组 4e5次操作 每次把Li,Ri中的每个数插入进来 问当前的中位数 题解:把这n个区间离散化 ...

  2. 【noi 2.6_7627】鸡蛋的硬度(DP)

    题意:其中n表示楼的高度,m表示你现在拥有的鸡蛋个数. 解法:f[i][j]表示 i 层楼有 j 个鸡蛋时,至少要扔多少次.3重循环,k为测试的楼层,分这时扔下去的鸡蛋碎和不碎的情况.要注意初始化. ...

  3. Codeforces Round #653 (Div. 3) E1. Reading Books (easy version) (贪心,模拟)

    题意:有\(n\)本书,A和B都至少要从喜欢的书里面读\(k\)本书,如果一本书两人都喜欢的话,那么他们就可以一起读来节省时间,问最少多长时间两人都能够读完\(k\)本书. 题解:我们可以分\(3\) ...

  4. 流媒体传输协议之 RTP (上篇)

    本系列文章将整理各个流媒体传输协议,包括 RTP/RTCP,RTMP,希望通过深入梳理协议的设计细节,能够给流媒体领域的开发者带来一定的启发. 作者:逸殊 审核:泰一 介绍 RTP,即 real-ti ...

  5. 实战交付一套dubbo微服务到k8s集群(5)之使用Jenkins进行持续构建交付dubo服务的提供者

    1.登录到jenkins,新建一个项目 2.新建流水线 3.设置保留的天数及份数 4.添加第一个参数:设置项目的名称 5.添加第二个参数:docker镜像名称 6.添加第三个参数:项目所在的git中央 ...

  6. Python_变量作用域与修改

    引用全局变量,不需要golbal声明,修改全局变量,需要使用global声明,特别地,列表.字典等如果只是修改其中元素的值(而不是整体赋值的形式),可以直接使用全局变量,不需要global声明. 参考 ...

  7. C++中二维数组作为函数参数

    在平时,我们经常会遇到将整个数组作为函数参数的情况,一维数组的情况,就是用数组名当形参和实参,传递的是数组的首地址.二维数组我们用的也很多,但是总是有各种问题,今天我总结一下 有个很重要的一点,字符串 ...

  8. C、C++语言中参数的压栈顺序

    要回答这个问题,就不得不谈一谈printf()函数,printf函数的原型是:printf(const char* format,-) 没错,它是一个不定参函数,那么我们在实际使用中是怎么样知道它的参 ...

  9. C++ part6.5

    1.虚函数表建立和虚函数表指针初始化 虚拟函数表是在编译期就建立了,各个虚拟函数这时被组织成了一个虚拟函数的入口地址的数组.而虚函数表指针是在运行期,也就是构造函数被调用时进行初始化的,这是实现多态的 ...

  10. 翻译:《实用的Python编程》01_04_Strings

    目录 | 上一节 (1.3 数字) | 下一节 (1.5 列表) 1.4 字符串 本节介绍处理文本的方法. 表示字面量文本 在程序中字符串字面量使用引号来书写. # 单引号(Single quote) ...