Bootstrap

opencv-python:ROI与范洪填充

什么是ROI:

     ROI区域即一张图上你感兴趣的区域,可以用数组切片的方式选出图像的特定区域对ROI区域的操作,也会反应在原图上。

import cv2 as cv
import numpy as np


src = cv.imread("C:/Users/idmin/Desktop/img/img1.jpg")
print(src.shape)
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
word = src[20:280, 20:280]
gray = cv.cvtColor(word, cv.COLOR_BGR2GRAY)
backword = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)
src[20:280, 20:280] = backword
cv.imshow("word", src)
cv.waitKey(0)
cv.destroyAllWindows()  # 关闭所有窗口

效果图:挖出原图的一部分,转换为灰度图,再把灰度图转为BGR,放回到原图中去。

什么是范洪填充:

      泛洪填充,即制定图中某一像素,以该像素为基准点,设置像素值的上限与下限。所有处在上下限范围内的像素,都会被填充为指定的新颜色

def fill_color(img):
    copyimg = img.copy()
    h, w = img.shape[:2]
    mask = np.zeros([h+2, w+2], dtype=np.uint8)
    # opencv要求mask数据类型必须是uint8
    # 调用泛洪填充时,只有mask参数中像素值为0的区域才会被填充
    # mask用来规定我们在什么范围内才被允许做填充
    # 此处mask全部为0,所以整个图像都会被考虑
    cv.floodFill(copyimg, mask, (30, 30), (0, 255, 255), (100, 100, 100), (50, 50, 50), cv.FLOODFILL_FIXED_RANGE)
    # 第三个参数为种子像素,也就是填充的起始点(30,30)
    # 第四参数(0,255,255)表示填充的颜色(这里是黄色)
    # 第五参数规定像素值范围下限,下限为 种子像素值-(100,100,100)
    # 第六参数规定像素值范围上限,上限为 种子像素值+(50,50,50)
    cv.imshow("fill_color_demo", copyimg)

效果图:

二值填充:

def fill_binary_demo():
    # 二值填充,通过限定mask中像素值为0的区域来规定填充区域
    img = np.zeros([400, 400, 3], dtype=np.uint8)
    img[100:300, 100:300, :] = 255
    copying = img.copy()
    cv.imshow("copying", copying)
    h, w = copying.shape[0:2]
    mask = np.ones([h + 2, w + 2, 1], dtype=np.uint8)
    # mask初始全部为1
    mask[151:251, 151:251, :] = 0
    # 设置允许填充区域(mask中像素值为0的区域才允许被填充)
    # 此时填充既受到原图影响,又受到mask影响
    cv.floodFill(copying, mask, (200, 200), (45, 25, 255), cv.FLOODFILL_MASK_ONLY)
    # 第三个参数为种子像素,也就是填充的起始点(200,200)
    # 第四参数(0,255,255)表示填充的颜色(这里是黄色)
    cv.imshow("floodfill_bin", copying)

效果图:

;