【图像篇】OpenCV图像处理(四)---图像切割&ROI选取
遍识天下英雄路,俯首江左有梅郎。
前言
大家好,我们又见面了,在上一期的文章中,我们简单的讲解了图像的数据形式以及三通道彩色图像的通道分离,通道分离的意义在于,我们在进行图像处理的时候可能并不需要三个通道的数据仅仅一个通道就可以解决了,因此,采用单个通道的数据可以使得图像处理节省更多的时间,关于上期的文章,见文末。当然通道分离也有其他的作用,先卖个关子,我们后期再叙,一起来看看今天的文内容吧。
1.1 图像切割简介
图像切割的意思是截取图像的某一部分,达到分割的目的。
我们来看一下原始图像:
显然这是一幅雪景图,如果把这个图像画两条水平和竖直的对称轴,图像就可以被分为四块,现在我们想要截取图像的左上角这一块该怎么做呢?接着往下看吧!
1.2 代码实践
#coding:utf-8
import numpy as np
import cv2
# 指定图像文件路径(此处使用相对地址)
img_path = './04.jpg'
# 读取图像
img = cv2.imread(img_path)
image_width = img.shape[1]
image_height = img.shape[0]
# 裁剪图像,0,0代表图像左上角的坐标(起始坐标)
# 左上部分截取
imCrop_left_top = img[0 : image_height//2, 0:image_width//2]
# 左下部分截取
imCrop_left_down = img[image_height//2 : image_height, 0:image_width//2]
#右上部分截取
imCrop_right_top = img[0 : image_height//2, image_width//2:image_width]
#右下部分截取
imCrop_right_down = img[image_height//2 : image_height, image_width//2:image_width]
# Display cropped image
# 显示左上图像
cv2.imshow("left_top", imCrop_left_top)
# 显示左下图像
cv2.imshow("left_down", imCrop_left_down)
cv2.imshow("right_top", imCrop_right_top)
cv2.imshow("right_down", imCrop_right_down)
cv2.waitKey(0)
cv2.destroyAllWindows()
代码解读:
在上面的代码中,我们主要注意的是图像截取代码:
img[0 : image_height//2, 0:image_width//2]
其中:
0,0位置的值代表的是截取图像的左上角起始点。
image_height//2、image_width//2位置的值代表截取图像的高度和宽度。
由此,我们可以截取从0,0,出发,
高度为:image_height//2,
宽度为:image_width//2的图像。
为了方便,小编把图像四个部分的代码也写在里面了哦。
1.3 效果展示
左上:
左下:
2.1 ROI简介
从上面的例子中,我们可以看到,要截取图像的某一部分,我们必须首先要知道图像的起始点和宽度,高度信息,这样一来,显得十分麻烦,那么,我们是否可以采用鼠标截取的方式,直接得到图像的坐标信息呢?下面我们就来用函数的方式实现吧!
2.2 代码实践
#coding:utf-8
import numpy as np
import cv2
# 指定文件路径
img_path = './04.jpg'
# Read image
img = cv2.imread(img_path)
# 创建一个窗口
#cv2.namedWindow("image", flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO)
#cv2.namedWindow("image_roi", flags= cv2.WINDOW_NORMAL | cv2.WINDOW_FREERATIO)
cv2.imshow("image", img)
# 是否显示网格
showCrosshair = False
# 如果为Ture的话 , 则鼠标的起始位置就作为了roi的中心
# False: 从左上角到右下角选中区域
fromCenter = False
# 选择 ROI(感兴趣的部分)图像
rect = cv2.selectROI("image", img, showCrosshair, fromCenter)
(x, y, w, h) = rect
# 截取的图像
imCrop = img[y : y+h, x:x+w]
# 显示截取图像
cv2.imshow("image_roi", imCrop)
#cv2.imwrite("image_roi.jpg", imCrop)
cv2.waitKey(0)
代码解读:
该代码中,主要注意的地方在于这个函数:
cv2.selectROI("image", img, showCrosshair, fromCenter)
参数解释
"image" : winName 窗口名称
img : 目标想要裁剪的图像
showCrosshair : 是否显示网格
True :显示网格
False :只有矩形
fromCenter:
True: 第一次选中的点为矩形的中心.
False: 第一次选中的点为矩形的左上角.
返回的是一个tuple值, 代表矩形区域. 分别代表矩形左上角坐标 (x, y) 与矩形宽度w跟高度h
(x, y, w, h) = rect
切片的时候一定要注意, 第一维指的是行数, 第二维度指的是列数.
imCrop = img[y : y+h, x:x+w]
2.3 显示效果
运行代码后,用鼠标从左到右画框显示。
截取后:
结语
今天分享的内容到此结束了,虽然短暂,但是需要消化的东西却不少,我们的文章很少出现长篇大论,因此,不管你忙不忙,我们的每一篇文章你都有足够的时间去实践,期待粉丝朋友们的一步步提升,不求甚多,略有小助,足矣。
编辑:玥怡居士|审核:小圈圈居士