一、ROI
ROI:region of interest,即感興趣區域。
一般主要通過numpy來獲取ROI
將某區域轉變為灰色圖片再覆蓋原圖像
import cv2
import numpy as npsrc = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)roi = src[0:100,0:100]
gray = cv2.cvtColor(roi,cv2.COLOR_BGR2GRAY)
back = cv2.cvtColor(gray,cv2.COLOR_GRAY2BGR)
src[0:100,0:100] = back
cv2.imshow("roi ",src)cv2.waitKey(0)
cv2.destroyAllWindows()
效果圖如下:
二、彩色圖像的泛洪填充
泛洪填充,如何填充一個對象內部區域
FLOODFILL_FIXED_RANGE
改變圖像,泛洪填充
FLOODFILL_MASK_ONLY
不改變圖像,只填充遮罩層本身,忽略新的顏色值參數
floodFill(Mat image,Mat mask,Point seedPoint,Scalar newVal)
floodFill(image,mask,seedPoint,newVal,rect,IoDiff,upDiff,flags)
src(seed.x,seed.y) - IoDiff <= src(x,y) <= src(seed.x,seed.y) + upDiff
cv2.floodFill(copyImg,mask,(30,30),(0,255,255),(100,100,100),(50,50,50),cv2.FLOODFILL_FIXED_RANGE)
在(30,30)處的像素值-(100,100,100)處的像素值,所得的結果為要填充的像素的最小值
在(30,30)處的像素值+(50,50,50)處的像素值,所得的結果為要填充的像素的最大值
cv2.FLOODFILL_FIXED_RANGE表示在(30,30)這個位置周圍的且像素值在最大值和最小值之間的區域都填充成(0,255,255)黃色
np.zeros([h+2,w+2],np.uint8)
,mask的大小必須是h+2,w+2,類型是uint8,這是OpenCV的規定。
import cv2
import numpy as npdef fill_color(image):copyImg = image.copy()h,w=image.shape[:2]mask = np.zeros([h+2,w+2],np.uint8)cv2.floodFill(copyImg,mask,(30,30),(0,255,255),(100,100,100),(50,50,50),cv2.FLOODFILL_FIXED_RANGE)cv2.imshow("fill_color",copyImg)src = cv2.imread(r"G:\Juptyer_workspace\study\opencv\opencv3\a1.jpg")
cv2.imshow("image",src)
fill_color(src)cv2.waitKey(0)
cv2.destroyAllWindows()
效果圖如下:
三、二值圖像的泛洪填充
先創建一個全為0的400 * 400的黑色圖像 , 取100 : 200 , 100 : 200 該區域賦值為255,白色。黑色背景有白色方塊
創建402*402的掩膜全為1的圖像,取101:201,101:201區域為0,黑色
想填充的區域設置為0,mask區域設置為1
cv2.floodFill(image,mask,(150,150),(0,0,255),cv2.FLOODFILL_MASK_ONLY)
將(150,150)周圍的像素點相等的像素區域被(0,0,255)紅色給填充
import cv2
import numpy as npdef fill_binary():image = np.zeros([400,400,3],np.uint8)image[100:200,100:200,:] = 255cv2.imshow("fill_binary_image",image)mask = np.ones([402,402],np.uint8)mask[101:201,101:201] = 0cv2.floodFill(image,mask,(150,150),(0,0,255),cv2.FLOODFILL_MASK_ONLY)cv2.imshow("fill_binary_mask",image)fill_binary()cv2.waitKey(0)
cv2.destroyAllWindows()
效果圖如下: