1. ROI
ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。在Halcon、OpenCV、Matlab等机器视觉软件上常用到各种算子(Operator)和函数来求得感兴趣区域ROI,并进行图像的下一步处理。
ROI ROI多用于图像合并,之后高斯模糊,可以无缝连接
1.1 PS怎么知道宽与高尺寸
每个图层框框都要标出宽与高的尺寸,我要怎么弄?
你在ps里按F8显示信息,在那个面板下拉三角的选项里将单位调成像素,然后你鼠标停的位置就可以看到座标了(上面那个图的标注标的实在很差) ,某个图形的长宽之类的数据,可以计算得出,也可以用选框工具选中了之后,在信息那个窗口看W宽和H高
1.2 代码
# -*- coding:utf-8 -*-
# Linda Li 2019/8/18 7:36 cv_19_roi PyCharm
import cv2 as cv
import numpy as np
print("------hello python------")
src = cv.imread("../cv_02/cv_193.jpeg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
# 高度53:198,宽度360:475,将人脸抠出来
face = src[53:198, 360:475]
cv.imshow("face", face)
# 转换为灰度图像
gray_face = cv.cvtColor(face, cv.COLOR_BGR2GRAY)
cv.imshow("gray_face", gray_face)
# 将gray_face还原为RGB图像,之后才可以拼到原来的RGB图像上
backface = cv.cvtColor(gray_face, cv.COLOR_GRAY2BGR)
cv.imshow("backface", backface)
src[53:198, 360:475] = backface
cv.imshow("after_src", src)
cv.waitKey(0)
cv.destroyAllWindows()
2泛洪填充
最长见的是递归算法和基于扫描项的算法,基于扫描项的算法更快,更常用
OpenCV要求mask的类型必须是uint8,必须高和宽+2是为了周边像素被处理,并且需要时单通道
2.1 cv.FLOODFILL_FIXED_RANGE
改变图像,泛洪填充
# -*- coding:utf-8 -*-
# Linda Li 2019/8/18 7:36 cv_19_roi PyCharm
import cv2 as cv
import numpy as np
def fill_color_demo(image):
"""彩色图像的填充"""
# 从原图中拷贝一张图像出来
copyImg = image.copy()
# 提取出image的宽和高
h, w = image.shape[:2]
# OpenCV要求mask的类型必须是uint8,必须高和宽+2是为了周边像素被处理,并且需要时单通道
mask = np.zeros([h + 2, w + 2], np.uint8)
# 在(30,30)这个点取当前的像素BGR值,减去100,100是要填充的最低的像素的范围
# 在30,30)这个点取当前的像素BGR值,加上50,50是要填充的最低的像素的范围
# cv.FLOODFILL_FIXED_RANGE在上面的范围内的全部都填充上黄色(0, 255, 255)
cv.floodFill(copyImg, mask, (30, 30), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)
cv.imshow("fill_color_demo", copyImg)
print("------hello python------")
src = cv.imread("../cv_02/cv_193.jpeg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
# 调用函数
fill_color_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()
2.2 cv.FLOODFILL_MASK_ONLY
不改变图像,只填充遮罩层本身,忽略新的颜色值参数
# -*- coding:utf-8 -*-
# Linda Li 2019/8/18 7:36 cv_19_roi PyCharm
import cv2 as cv
import numpy as np
def fill_binary():
image = np.zeros([400, 400, 3], np.uint8)
# 3个通道的高100:300,宽100:300的范围内都赋值为255,也就是中间的一块200*200的区域为白色
image[100:300, 100:300, :] = 255
cv.imshow("fill_binary", image)
# 建立一个蒙版,OpenCV要求mask的类型必须是uint8,必须高和宽+2是为了周边像素被处理,并且需要时单通道
mask = np.ones([402, 402, 1], np.uint8)
# mask也是中间的200*200的一块区域,并且赋值为黑色注意=0
# 遮罩层必须是0,如果已经是1了就不会填充图像了
mask[101:301, 101:301] = 0
# seedpoint = (200, 200)从这个图的最开始位置开始填充
cv.floodFill(image, mask, (200,200), (0, 0, 255), cv.FLOODFILL_MASK_ONLY)
cv.imshow("filled_binary", image)
print("------hello python------")
# 调用函数
fill_binary()
cv.waitKey(0)
cv.destroyAllWindows()