RIO与泛洪填充——(OpenCV+Python)
1.ROI
ROI(region of interest),感興趣區(qū)域。機(jī)器視覺、圖像處理中,從被處理的圖像以方框、圓、橢圓、不規(guī)則多邊形等方式勾勒出需要處理的區(qū)域,稱為感興趣區(qū)域,ROI。
圖片截取、合并、填充
import cv2 as cvsrc = cv.imread('C:\pics\samples\data\lena.jpg') cv.namedWindow('first_image',cv.WINDOW_AUTOSIZE) cv.imshow('first_image',src) face = src[200:300,200:400] #選擇200:300行、200:400列區(qū)域作為截取圖像 gray = cv.cvtColor(face,cv.COLOR_BGR2GRAY) #生成的灰度圖是單通道圖像 backface = cv.cvtColor(gray,cv.COLOR_GRAY2RGB) #將單通道圖像轉(zhuǎn)換為三通道RGB灰度圖,因?yàn)橹挥腥ǖ赖腷ackface才可以賦給三通道的src src[200:300,200:400] = backface cv.imshow("face",src) cv.waitKey(0) cv.destoryAllWindows()
2.泛洪填充(彩色圖像填充)
1.opencv里的mask都是為uin8類型的單通道陣列
2.泛洪填充算法也叫漫水填充算法。opencv的floodFill函數(shù)原型: floodFill(image, mask, seedPoint, newVal[, loDiff[, upDiff[, flags]]]) -> retval, image, mask, rect
image參數(shù)表示輸入/輸出1或3通道,8位或浮點(diǎn)圖像。
mask參數(shù)表示掩碼,該掩碼是單通道8位圖像,比image的高度多2個(gè)像素,寬度多2個(gè)像素。填充時(shí)不能穿過輸入掩碼中的非零像素。
seedPoint參數(shù)表示泛洪算法(漫水填充算法)的起始點(diǎn)。
newVal參數(shù)表示在重繪區(qū)域像素的新值。
loDiff參數(shù)表示當(dāng)前觀察像素值與其部件鄰域像素值或待加入該組件的種子像素之間的亮度或顏色之負(fù)差的最大值。
upDiff參數(shù)表示當(dāng)前觀察像素值與其部件鄰域像素值或待加入該組件的種子像素之間的亮度或顏色之正差的最大值。
flags參數(shù):操作標(biāo)志符,包含三部分:(參考https://www.cnblogs.com/little-monkey/p/7598529.html)
低八位(0~7位):用于控制算法的連通性,可取4(默認(rèn))或8。
中間八位(8~15位):用于指定掩碼圖像的值,但是如果中間八位為0則掩碼用1來填充。
高八位(16~32位):可以為0或者如下兩種標(biāo)志符的組合:
FLOODFILL_FIXED_RANGE:表示此標(biāo)志會(huì)考慮當(dāng)前像素與種子像素之間的差,否則就考慮當(dāng)前像素與相鄰像素的差。FLOODFILL_MASK_ONLY:表示函數(shù)不會(huì)去填充改變原始圖像,而是去填充掩碼圖像mask,mask指定的位置為零時(shí)才填充,不為零不填充。
3.泛洪填充(二值圖像填充)
#泛洪填充(二值圖像填充) import cv2 as cv import numpy as np 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], np.uint8) #mask要保證比原圖像高和寬都多2mask[101:301, 101:301] = 0cv.floodFill(image, mask, (200,200), (255 , 0, 0), cv.FLOODFILL_MASK_ONLY) #mask不為0的區(qū)域不會(huì)被填充,mask為0的區(qū)域才會(huì)被填充cv.imshow("filled_binary", image) fill_binary() cv.waitKey(0) cv.destroyAllWindows()
1.不管是FLOODFILL_FIXED_RANGE還是FLOODFILL_MASK_ONLY操作,泛洪填充都不會(huì)填充掩膜mask的非零像素區(qū)域
2. mask[101:301, 101:301] = 0 這條語句為什么是101:301而不是100:300呢?我覺得應(yīng)該是掩膜mask是比原圖像左右上下都多了1,所以掩膜mask左右一共比原圖像多2,上下也比原圖像多2。那么原圖像的100就自然對應(yīng)到掩膜的101,同樣原圖像的300就自然對應(yīng)到掩膜的301。
3.當(dāng)FLOODFILL_MASK_ONLY設(shè)置了的時(shí)候,原圖不會(huì)改變,只會(huì)用中間八位的值填沖mask。 floodFill的flags參數(shù)的中間八位的值就是用于指定填充掩碼圖像的值的,但是如果flags中間八位的值為0,則掩碼會(huì)用1來填充。
很多問題參考https://www.cnblogs.com/FHC1994/p/9033580.html,感謝!!!
總結(jié)
以上是生活随笔為你收集整理的RIO与泛洪填充——(OpenCV+Python)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 珊瑚虫论坛版主自建网站声援珊瑚虫QQ
- 下一篇: jsp+ssm计算机毕业设计游戏装备交易