目录
2. 重点知识:ROI(Region of Interest,感兴趣区域)
代码:
import cv2
import numpy as np
img = cv2.imread(r"F:\tp\lena.jpg")
b = np.ones((101, 101, 3))
b = img[150:250, 250:350]
img[0:100, 0:100] = b
cv2.imshow("img", img)
cv2.imshow("face", b)
cv2.waitKey(0)
cv2.destroyAllWindows()
# ====================================
img = cv2.imread(r"F:\tp\lena.jpg")
fy = cv2.imread(r"F:\tp\kt.jpg")
b = np.ones((101, 101, 3))
b = img[150:250, 250:350]
img[0:100, 0:100] = b
fy[0:100, 0:100] = b
cv2.imshow("img", fy)
cv2.waitKey(0)
cv2.destroyAllWindows()
1. 代码逐行解读
第一段代码
import cv2
import numpy as np
# 读取图像(默认加载为BGR彩色图)
img = cv2.imread(r"F:\tp\lena.jpg")
# 创建一个形状为(101,101,3)的全1数组(初始化为白色,因为BGR中[1,1,1]是白色)
b = np.ones((101, 101, 3)) # 注意:实际会被后续代码覆盖
# 截取图像中的ROI区域:从行150到249,列250到349(100x100区域)
b = img[150:250, 250:350]
# 将ROI复制到原图左上角0:99行和0:99列的位置
img[0:100, 0:100] = b
# 显示修改后的图像和ROI区域
cv2.imshow("img", img) # 左上角出现ROI的复制块
cv2.imshow("face", b) # 单独显示截取的ROI区域
cv2.waitKey(0) # 按任意键关闭窗口
cv2.destroyAllWindows()
输出结果:
第二段代码
# 重新读取原图和另一张图像(kt.jpg)
img = cv2.imread(r"F:\tp\lena.jpg")
fy = cv2.imread(r"F:\tp\kt.jpg")
# 重复之前的ROI截取操作
b = np.ones((101, 101, 3)) # 无用代码,会被覆盖
b = img[150:250, 250:350] # 截取lena.jpg的ROI
# 将ROI复制到原图和另一张图fy的左上角
img[0:100, 0:100] = b # 修改原图(未显示)
fy[0:100, 0:100] = b # 修改另一张图fy
# 显示修改后的fy图像(原图未显示)
cv2.imshow("img", fy) # fy的左上角出现lena的ROI
cv2.waitKey(0)
cv2.destroyAllWindows()
输出结果:
2. 重点知识:ROI(Region of Interest,感兴趣区域)
(1) ROI是什么?
-
定义:图像中的一个子区域,通常是需要重点处理或分析的部分(如人脸、文字区域等)。
-
作用:减少计算量,聚焦关键信息,常用于图像裁剪、局部修复、特征提取等。
(2) 如何操作ROI?
-
截取ROI:通过 数组切片 直接提取区域。
# 语法:img[y1:y2, x1:x2] roi = img[150:250, 250:350] # 行范围150-249,列范围250-349(100x100区域)
-
注意:切片区间是左闭右开(如
150:250
包含150,不包含250)。
-
-
粘贴ROI:将ROI复制到其他位置或其他图像。
# 目标区域必须与ROI尺寸一致! img[0:100, 0:100] = roi # 将ROI粘贴到左上角
(3) 代码中的ROI操作
-
第一段代码:
-
从
lena.jpg
中截取一个100x100的ROI(如眼睛区域)。 -
将该ROI复制到原图的左上角,形成“重复的局部图像”。
-
-
第二段代码:
-
将同样的ROI粘贴到另一张图像
kt.jpg
的左上角,实现“图像混合”。
-
(4) 关键注意事项
-
尺寸匹配:
目标区域的大小必须与ROI完全一致,否则报错(如尝试将100x100的ROI粘贴到90x90的区域)。 -
颜色通道:
-
彩色图ROI形状为
(h, w, 3)
,灰度图则为(h, w)
。 -
如果目标区域通道数不匹配(如彩色ROI粘贴到灰度图),会导致错误。
-
-
越界问题:
-
截取ROI时需确保原图足够大(如原图尺寸不足250行或350列会报错)。
-
-
数据类型:
-
ROI和目标区域的像素类型(如
uint8
)需一致,否则可能丢失精度。
-
3. 总结与扩展
核心总结
操作 | 语法示例 | 说明 |
---|---|---|
截取ROI | roi = img[y1:y2, x1:x2] | 切片区间左闭右开,注意行列顺序 |
粘贴ROI | target[y1:y2, x1:x2] = roi | 目标区域尺寸必须与ROI完全一致 |
跨图操作 | img2[...] = img1[...] | 支持不同图像间的ROI复制 |
应用场景
-
局部修复:用周围像素覆盖图像中的水印或噪点。
-
图像合成:将一张图的ROI粘贴到另一张图中(如表情包制作)。
-
目标检测:对检测到的物体区域(ROI)进行单独处理。
常见错误
-
尺寸不匹配:
# 错误示例:ROI是100x100,目标区域是90x90 img[0:90, 0:90] = roi # 报错:无法广播
-
通道不匹配:
# 错误示例:彩色ROI粘贴到灰度图 gray_img[0:100, 0:100] = roi # 报错:维度不匹配
扩展练习
-
动态ROI选择:用鼠标交互选择ROI区域(需结合OpenCV的鼠标回调函数)。
-
ROI缩放:将截取的ROI放大或缩小后粘贴到目标位置。
-
多ROI操作:同时处理图像中的多个ROI区域(如批量添加马赛克)。
通过这段代码,掌握了图像处理中 ROI操作 的核心方法,这是图像编辑、计算机视觉任务的基础技能。