OpenCV之ROI和泛洪填充
一、獲取RIO區域
?
二、泛洪填充
泛洪算法——floodFill函數原型
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:為泛洪算法的種子點,也是根據該點的像素判斷決定和其相近顏色的像素點,是否被泛洪處理。
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)
flags: 操作標志符,為泛洪算法的處理模式,包含二部分:
低八位(0~ 7位):用于控制算法的連通性,可取4(默認)或8
高八位(16~ 32位):可以為0或者如下兩種標志符的組合:
FLOODFILL FIXED_ RANGE:設置此標志符會考慮當前像素與種子像素之間的差,否則就考慮當前像素與其相鄰像素的差
FLOODFILL MASK_ ONLY:設置此標志符,函數不會去填充改變原始圖像(即忽略第三個參數newVal),而去填充掩碼圖像mask
中間八位(8~ 15位):用于指定填充掩碼圖像的值,但是如果中間/ \位為0則掩碼用1來填充
低八位?控制算法的連通性,是以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參數失去作用,而是改變對應區域的掩碼,設為中間八位的值
代碼實操
import cv2 as cv import numpy as npdef fill_color_demo(image):copyImg = image.copy()h, w = image.shape[:2]"""mask:為掩碼層,使用掩碼可以規定是在哪個區域使用該算法如果是對于完整圖像都要使用,則掩碼層大小為原圖行數+2,列數+2.是一個二維的0矩陣,邊緣一圈會在使用算法是置為1。而只有對于掩碼層上對應為0的位置才能泛洪,所以掩碼層初始化為0矩陣。"""mask = np.zeros([h+2, w+2], np.uint8) #mask必須是單通道8位#泛洪區域下界為(B0-loDiff1,G0-loDiff2,R0-loDiff3)#泛洪區域上界為(B0 + upDiff1, G0 + upDiff2, R0 + upDiff3)#a,b,c = image[30,30,:] ==> (a-100,b-100,c-100)到(a+50, b+50, c+50)之間的像素值全部變成(0,255,255)cv.floodFill(copyImg, mask, (30, 30), (0, 255, 255), (100, 100, 100), (50, 50, 50), flags=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, :] = 255cv.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) print("----------hello python----------") src = cv.imread("gyy.png") cv.namedWindow("input image", cv.WINDOW_AUTOSIZE) cv.imshow("input image", src) fill_color_demo(src) fill_binary() cv.waitKey(0) cv.destroyAllWindows()總結
以上是生活随笔為你收集整理的OpenCV之ROI和泛洪填充的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: PhpOffice/PhpSpreads
- 下一篇: Python+Twisted+Autob