【计算机视觉处理3】图像基本处理

1、图像切片

在前面我们了解到opencv中的图像实际上就是一个ndarray数组,我们对ndarray数组进行操作就是对图像进行操作。我们先来看一下切片查找,这是我们非常常用的一个操作。

(1)一维数组的切片

我们来看看切片的语法,对于一维的数组我们可以通过下面的操作获取第0个到第4个元素:

array[0:5]

从上面可以知道我们的切片操作是左闭右开的。上面的切片操作我们可以简写一下:

array[:5]

如果我们没有设置第一个值,则表示从头开始切片。当然我们还可以省略第二个值,这时含义就是取到最后一个元素,比如下面的操作:

array[3:]

我们用一个实际的例子来看看切片操作:

import numpy as np
# 创建一个一维的ndarray数组,数据为[0, 1, 2, 3, 4, 5, 6, 7]
array = np.array([0, 1, 2, 3, 4, 5, 6, 7])
# 取0到4个元素
print(array[0:5])
print(array[:5])
# 取第3个到最后一个元素
print(array[3:])

输出内容如下:

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

我们可以把切片操作总结为:

# 左闭右开
array[start: end-1]

当我们以第0个开始,获取以最后一个结尾的话,对应的值是可以省略的。

(2)二维数组的切片

在图像处理中,我们更关注二维数组的切片。它的语法和一维数组很相似。为了方便理解,我们直接使用图片来进行切片,比如下面这张图片:

二维数组切片的语法如下:

array[start:end-1, start:end-1]

现在我们需要明确一点,左边部分是对高的截取,右边部分是对宽的截取。那现在我要截取图片的左半部分的操作应该如下:

import cv2
# 读取图片
img = cv2.imread('xyql.jpg')
# 获取图片的宽,并除2
width = img.shape[1]//2
# 对图片进行切片,截取左半部分
left = img[:, :width]
# 显示图像三步骤
cv2.imshow('left', left)
cv2.waitKey(0)
cv2.destroyAllWindows()

其中切片的代码是:

left = img[:, :width]

左边的是截取高,我们需要全部截取,因此两个值都可以省略。右边我们只需要截取左半部分,因此左边的值可以省略,右边的值则是我们前面计算到的宽度。下面是效果图:

这里需要注意一点,彩色图像其实是三维的,但是我们没有操作第三个维度。

2、图片区域替换

既然我们知道如何切片,那我们就可以对指定区域进行替换。不过需要注意替换和被替换的区域形状要相同,即shape属性要一样。比如我要把图片左上角100*100的区域替换成白色,那我可以进行如下操作:

import cv2
import numpy as np
img = cv2.imread('1.jpg')
# 创建一个100*100的白色图像
replace_img = np.ones((100, 100), dtype=np.uint8)*255
# 将图片左上角100*100区域替换
img[:100, :100] = replace_img

运行后会发现报了如下错误:

    img[:100, :100] = replace_img
ValueError: could not broadcast input array from shape (100,100) into shape (100,100,3)

它的意思是不能将(100, 100)的图像转换成(100, 100, 3)的图像,也就是形状不匹配。在替换时我们需要特别注意这一点,我们将上面的代码进行一些修改:

import cv2
import numpy as np
img = cv2.imread('xyql.jpg')
replace_img = np.ones((100, 100, 3), dtype=np.uint8)*255
img[:100, :100] = replace_img

*这样我们就可以成功替换了,效果如下:

其实用上面的操作我们可以实现一个“双胞胎”效果,下面我们就来看看吧。

3、实现“双胞胎”效果

我们先准备两张图片,保证相机在没有移动的情况下拍两张图片,比如下面两张:

这是我刚拍的两张图片,因为相机没有移动,所以背景应该是一样的。我们可以通过下面的代码把两个梦幻合并到一张图片上:

import cv2
# 读取两张图片
img1 = cv2.imread('mh1.JPG')
img2 = cv2.imread('mh2.JPG')
# 求出宽的中间值
mid = img1.shape[1]//2
# 把mh2的右半边替换到mh1的右半部分
img1[:, mid:] = img2[:, mid:]
# 将拼接后的图片保存到本地
cv2.imwrite('result.jpg', img1)

上面代码非常简单,我们只需要关注下面这句:

img1[:, mid:] = img2[:, mid:]

img1和img2的shape都是一样的,截取的区域也是一样的,所以进行替换没有上面问题。最后我们通过:

cv2.imwrite('result.jpg', img1)

对图片进行保存。因为我们是直接对img1进行操作,因此我们直接保存img1就好了。下面是我们的效果图:

这里需要多说一句,我只有一个梦幻。

4、numpy生成数组

在上一篇中我们使用下面的代码生成了一个数组:

im = np.zeros((3, 3, 1), dtype=np.uint8)

对于数组numpy来说我们是生成一个数组,但是对opencv来说是生成一张图片。下面我们来看看numpy生成数组的一些操作。

(1)np.ones

我们可以通过numpy的ones函数生成一个元素全为1的数组,比如下面的代码:

np.ones((100, 100), dtype=np.uint8)

ones接收两个参数,第一个参数是数组的shape,第二关则是数组元素的类型,其中np.uint8表示【无符号的8位整型】,即范围在(0-255)之间。我们可以用opencv显示一下上面的图片:

import cv2
import numpy as np
# 生成一个100*100的图片,每个元素的值都为1
img = np.ones((100, 100), dtype=np.uint8)
cv2.imwrite('result.jpg', img)

效果图如下:

因为1很接近0,所以图片的颜色接近于黑色。我们可以通过下面的操作对每个元素进行操作:

import cv2
import numpy as np
img = np.ones((100, 100), dtype=np.uint8) * 127
cv2.imwrite('result.jpg', img)

我们生成元素为1的数组后,如何进行乘127的操作,这样就可以对每个元素进行乘127操作。这时候数组的每个元素都是127,下面是显示效果:

当然我们的图片是二维的,对opencv来说是一个灰度图。如果想要生成一个彩色图像,我们可以生成一个三维的图像,后续我们会继续讲解。

(2)np.zeros

np.zeros和ones没有上面区别,只是它元素的内容是0。我们来简单看一下:

import numpy as np
img = np.zeros((5, 5), dtype=np.uint8)
print(img)

为了方便看,我们直接生成一个简单的数组,输出结果如下:

[[0 0 0 0 0][0 0 0 0 0][0 0 0 0 0][0 0 0 0 0][0 0 0 0 0]]

其它的都不再细说了。

【计算机视觉处理3】图像基本处理相关推荐

  1. CV:计算机视觉基础之图像存储到计算机的原理daiding

    CV:计算机视觉基础之图像存储到计算机的原理daiding 目录 图像存储到计算机的原理 图像存储到计算机的原理 其实图像文件存储的都是每一个像素对应的颜色值. 比如一幅图像有16个像素,那么这个图像 ...

  2. CV:计算机视觉技术之图像基础知识(二)—图像内核的可视化解释

    CV:计算机视觉技术之图像基础知识(二)-图像内核的可视化解释 目录 图像内核的可视化解释 测试九种卷积核 官方Demo DIY图片测试 DIY实时视频测试 相关文章 CV:计算机视觉技术之图像基础知 ...

  3. CV:计算机视觉技术之图像基础知识(二)—以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础)

    CV:计算机视觉技术之图像基础知识(二)-以python的skimage和numpy库来了解计算机视觉图像基础(图像存储原理-模糊核-锐化核-边缘检测核,进阶卷积神经网络(CNN)的必备基础) 目录 ...

  4. CV:计算机视觉技术之图像基础知识—以python的cv2库来了解计算机视觉图像基础

    CV:计算机视觉技术之图像基础知识-以python的cv2库来了解计算机视觉图像基础 目录 一.图像中的傅里叶变换 1.时域和频域 2.傅里叶变换 3.图像中的傅里叶变换

  5. CV:计算机视觉技术之图像基础知识(一)—以python的cv2库来了解计算机视觉图像基础(傅里叶变换-频域-时域/各种滤波器-线性-非线性-均值-中值-高斯-双边)

    CV:计算机视觉技术之图像基础知识(一)-以python的cv2库来了解计算机视觉图像基础(傅里叶变换-频域-时域/各种滤波器-线性-非线性-均值-中值-高斯-双边) 目录 一.图像中的傅里叶变换 1 ...

  6. 从特斯拉到计算机视觉之「图像语义分割」

    说起特斯拉,大家可能立马会想到今年5月份发生在特斯拉Model S自动驾驶上的一宗夺命车祸.初步的调查表明,在强烈的日照条件下,驾驶员和自动驾驶系统都未能注意到牵引式挂车的白色车身,因此未能及时启动刹 ...

  7. 【图像分割】基于计算机视觉实现视网膜图像中的血管分割附matlab代码

    1 简介 视网膜图像里的血管是可以被观察到的一类微血管,并且它是无创伤的,而其分布位置也属于深度部位[5].其分布.结构和形态特征的变化能在一定程度上反映病变的程度.而白血病.糖尿病以及高血压等疾病都 ...

  8. 计算机视觉:Opencv图像去畸变

    计算机视觉:Opencv图像去畸变 针孔相机模型图像去畸变 方法一 方法二 区别与联系 鱼眼相机模型图像去畸变 方法一 方法二 区别与联系 参考文献 针孔相机模型图像去畸变 针对畸变参数,k1,k2, ...

  9. 计算机视觉与图形图像会议、学派的一点八卦和资料

    computer vision(cv) 存在ICCV/CVPR/ECCV三个顶级会议, 它们档次差不多,都应该在一流会议行列, 没有必要给个高下. 有些us的人认为ICCV/CVPR略好于ECCV,而 ...

  10. 计算机视觉-深度学习图像检测方法梳理

    计算机视觉-深度学习图像检测方法梳理 由于之后要转方向啦,趁这段时间整理手中硕士研究方向的一些阅读笔记,这是一篇关于计算机视觉的基础知识梳理 先搞清一些小知识点 首先我们要弄清楚图像分类.目标定位.语 ...

最新文章

  1. ERROR: Failed to resolve: com.android.databinding:library:3.4.2
  2. 正由另一进程使用,因此该进程无法访问此文件。
  3. linux -bash: ipconfig: command not found 解决方法
  4. php服务器队列执行,lnmp php添加队列服务器的配置
  5. Spring boot定制错误数据携带出去
  6. js_调试_01_14 个你可能不知道的 JavaScript 调试技巧
  7. myeclipse去掉js报错
  8. Simulink之相控整流电路的组合
  9. Python学习入门基础:文件读写操作、模块和包、异常
  10. (90)常见伪路径约束情景
  11. python实现模糊搜索_Python 代码实现模糊查询
  12. jQuery~函数封装记1
  13. 贪吃蛇小游戏(C语言)
  14. android 动画停止播放,Android动画暂停和播放问题
  15. 首都师范 博弈论 5 5 1大联盟合作博弈中如何量化决策影响力 班扎夫权力指数
  16. 使用robo 3t连接mongodb的方法
  17. 谁是元宇宙的基础设施?数据中心助推元宇宙发展
  18. 在VM安装最新版Linux镜像
  19. DBM、GDBM与C语言跨平台代码研究
  20. 零基础语法入门第十二/十三讲指示代词和不定代词以及形容词

热门文章

  1. Jina AI 两周年 | 步履不停,尽情施展
  2. 【Cross-attention in DETR】
  3. linux下在终端用ASCII实现偶像练习生-鲲鲲爱打球
  4. HTML引入css文件(四种方法)
  5. bt5更改mysql密码_修改PostgreSQL数据库的默认用户postgres的密码
  6. 附加3 Merging Linked Lists (25 分)
  7. UnityShader屏幕特效之Bloom
  8. ameya360代理品牌 | 尼得科吹风机马达介绍
  9. 【CMD命令多开微信最详细适用教程】
  10. 【CV-Paper 14】Selective Search for Object Recognition