Opencv中cv2.floodFill算法的使用

时间:2022-08-30 00:22:57

一、 泛洪算法——floodfill函数原型

?
1
cv2.floodfill(img,mask,seed,newvalue(bgr),(lodiff1,lodiff2,lodiff3),(updiff1,updiff2,updiff3),flag)
  • img:为待使用泛洪算法的图像
  • mask:为掩码层,使用掩码可以规定是在哪个区域使用该算法,如果是对于完整图像都要使用,则掩码层大小为原图行数+2,列数+2.是一个二维的0矩阵,边缘一圈会在使用算法是置为1。而只有对于掩码层上对应为0的位置才能泛洪,所以掩码层初始化为0矩阵。【dtype:np.uint8
  • seed:为泛洪算法的种子点,也是根据该点的像素判断决定和其相近颜色的像素点,是否被泛洪处理。
    【类似于Opencv中cv2.floodFill算法的使用
  • newvalue:是对于泛洪区域新赋的值(b,g,r)
  • (lodiff1,lodiff2,lodiff3):是相对于seed种子点像素可以往下的像素值,即seed(b0,g0,r0),泛洪区域下界为(b0-lodiff1,g0-lodiff2,r0-lodiff3)
  • (updiff1,updiff2,updiff3):是相对于seed种子点像素可以往上的像素值,即seed(b0,g0,r0),泛洪区域上界为(b0+updiff1,g0+updiff2,r0+updiff3)
  • flag:为泛洪算法的处理模式。

Opencv中cv2.floodFill算法的使用

  • 低八位 控制算法的连通性,是以seed点为中心,接着判断周围的几个像素点,再将泛洪区域像素点周围的几个像素点进行考虑。 一般为4,8;默认为4
  • 中间八位 与掩码层赋值密切相关,一般使用(255<<8)使中间8位全位1,则值为255,也就是掩码层对应原图的泛洪区域的部分被由原来的初值0赋值成255,如果中间8位为0,则赋值为1.
  • 高八位 由opencv宏参数指定
    • cv2.floodfill_fixed_range:改变图像,填充newvalue
    • cv2.floodfill_mask_only:不改变原图像,也就是newvalue参数失去作用,而是改变对应区域的掩码,设为中间八位的值

Opencv中cv2.floodFill算法的使用

Opencv中cv2.floodFill算法的使用

二、简单应用

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#泛洪填充(彩色图像填充)
import cv2
import numpy as np
def fill_color_demo(image):
    copyimg = image.copy()
    h, w = image.shape[:2]
    mask = np.zeros([h+2, w+2],np.uint8)   #mask必须行和列都加2,且必须为uint8单通道阵列
    #为什么要加2可以这么理解:当从0行0列开始泛洪填充扫描时,mask多出来的2可以保证扫描的边界上的像素都会被处理
    cv.floodfill(copyimg, mask, (220, 250), (0, 255, 255), (100, 100, 100), (50, 50 ,50), cv.floodfill_fixed_range)
    cv.imshow("fill_color_demo", copyimg)
 
src = cv.imread('e:/imageload/baboon.jpg')
cv.namedwindow('input_image', cv.window_autosize)
cv.imshow('input_image', src)
fill_color_demo(src)
cv.waitkey(0)
cv.destroyallwindows()

Opencv中cv2.floodFill算法的使用

Opencv中cv2.floodFill算法的使用

三、应用,结合minarearect

?
1
2
3
4
5
6
7
8
9
10
11
cv2.floodfill(initial_car,mask,(seed_x,seed_y),(255,0,0),(lodiff,lodiff,lodiff),(updiff,updiff,updiff),flag)
 
points = []
row,column = mask.shape
 
for i in range(row):
    for j in range(column):
        if mask[i][j]==255:
           points.append((j,i))   #点应该输入点坐标(列,行)
points = np.asarray(points)
new_rect = cv2.minarearect(points)

到此这篇关于opencv中cv2.floodfill算法的使用的文章就介绍到这了,更多相关opencv cv2.floodfill内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/qq_37385726/article/details/82313004