当前位置: 代码迷 >> 综合 >> 8. 感兴趣区域提取ROI、泛洪填充cv2.floodFill()
  详细解决方案

8. 感兴趣区域提取ROI、泛洪填充cv2.floodFill()

热度:14   发布时间:2023-12-15 12:46:55.0

1. ROI-感兴趣区域提取

ROI(region of interest),感兴趣区域,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,经常用来连接图像。

代码如下:

def roi_test(src):face = src[100:510, 200:600]  # 高度,宽度.gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY)  # face彩色图片变成灰度图片cv.imshow("gray", gray)back_face = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)  # 将 R = G = B = gray,所以呈现出来的是灰色cv.imshow("back_face", back_face)    # back_face必须是三通道的src[100:510, 200:600] = back_facecv.imshow("face", src)

注意:

1. 当RGB中三个通道的值相同时,图片展现出来是灰色。

2. src[100 : 510, 200 : 600]指的是高和宽(opencv中宽和高总是分不清楚)。

2. 泛洪填充

将指定颜色从指定位置开始填充一个连通区域,此时的连通性由像素值的接近程度来衡量。

2.1 cv2.floodFill()

漫水填充法(cv2.floodFill)是一种用特定的颜色填充联通区域,通过设置可连通像素的上下限以及连通方式来达到不同的填充效果的方法。漫水填充经常被用来标记或分离图像的一部分以便对其进行进一步处理或分析,也可以用来从输入图像获取掩码区域,掩码会加速处理过程,或只处理掩码指定的像素点,操作的结果总是某个连续的区域。漫水填充算法是用来标记一片区域的:设置一个种子点,然后种子点附近的相似点都被填充同一种颜色。该算法应用性很广,比如目标识别,photoshop 的魔术棒功能等等,是填充类算法中应用最为广泛的一个算法。

cv2.floodFill(InputOutputArray image, Point seedPoint, Scalar newVal, Rect* rect=0, Scalar loDiff=Scalar(), Scalar upDiff=Scalar(), int flags=4 ) 

参数说明如下:

1.原图像, 2.掩模, 3.起始点,4.填充的颜色, 5.填充颜色的低值, 6.填充颜色的高值 ,7.填充的方法

讲解如下:

参数2:掩码参数 mask 必须是一个单通道,8位,像素宽度高度均比原图像大两个像素。mask 图像的像素 (x+1, y+1) 与原图像 (x, y) 相对应。为 0 的位表示不进行处理。同时,掩码区也会返回填充结果。

参数5.填充颜色的低值就是:参数3 位置的各个通道像素值减去 参数5

参数6.填充颜色的高值就是:参数3位置 的各个通道像素值加上 参数6

即是这两个数值之间的色素替换为参数4的颜色。

参数7:

  • FLOODFILL_FIXED_RANGE - 指定颜色填充。
  • FLOODFILL_MASK_ONLY - 只在mask对应的位置进行填充,且mask中为0的区域填充,不为0的区域不填充,否则没效果。

代码如下:

# roi 即兴趣区域,对图像提取想要的部分import cv2 as cv
import numpy as np
from matplotlib import pyplot as pltdef roi_test(src):face = src[100:510, 200:600]  # 高度,宽度.gray = cv.cvtColor(face, cv.COLOR_BGR2GRAY)  # face彩色图片变成灰度图片cv.imshow("gray", gray)back_face = cv.cvtColor(gray, cv.COLOR_GRAY2BGR)  # 将 R = G = B = gray,所以呈现出来的是灰色cv.imshow("back_face", back_face)src[100:510, 200:600] = back_face                 # back_face必须是三通道的cv.imshow("face", src)def fill_color_demo(image):copyImg = image.copy()h, w = image.shape[:2]mask = np.zeros([h+2, w+2], np.uint8)      # mask必须是一个单通道# 参数:原图,mask图,起始点,起始点值减去该值作为最低值,起始点值加上该值作为最高值,彩色图模式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)def fill_binary():image = np.zeros([400, 400, 3], np.uint8)image[100:300, 100:300, :] = 255         # 将这个范围的所有通道赋值cv.imshow("fill_binary", image)mask = np.ones([402, 402, 1], np.uint8)mask[101:301, 101:301] = 0cv.floodFill(image, mask, (200, 200), (100, 2, 255), cv.FLOODFILL_MASK_ONLY)cv.imshow("filled binary", image)if __name__ == '__main__':src = cv.imread("../images/CrystalLiu1.jpg")  # 读入图片放进src中# cv.namedWindow("Crystal Liu")  # 创建窗口# cv.imshow("Crystal Liu", src)  # 将src图片放入该创建的窗口中# roi_test(src)# fill_color_demo(src)fill_binary()# img = cv.imread("../images/opencv_logo.png")# make_border(img)cv.waitKey(0) # 等有键输入或者1000ms后自动将窗口消除,0表示只用键输入结束窗口cv.destroyAllWindows()  # 关闭所有窗口