Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在边界框外设置白色(Python、OpenCV)_Python_Opencv_Bounding Box - Fatal编程技术网

在边界框外设置白色(Python、OpenCV)

在边界框外设置白色(Python、OpenCV),python,opencv,bounding-box,Python,Opencv,Bounding Box,我有这样的图像: (或这个……) 如何将边界框外的所有区域设置为白色 我想得到这个结果: 谢谢使用与图像尺寸相同的蒙版。蒙版是一个值为255(白色)的数组。我假设,如果您正在绘制边界框,您肯定拥有每个边界框的坐标。对于每个边界框,您只需将遮罩中的区域替换为边界框所包围的区域,如下所示: 掩码[y:y+h,x:x+w]=图像[y:y+h,x:x+w],其中掩码是您的最终输出和所需结果,图像是要进行处理的输入图像。x、y、w、h的值对于两幅图像都是相同的,因为我们已经确保遮罩和输入图像的尺寸是

我有这样的图像:

(或这个……)

如何将边界框外的所有区域设置为白色

我想得到这个结果:


谢谢

使用与图像尺寸相同的蒙版。蒙版是一个值为255(白色)的数组。我假设,如果您正在绘制边界框,您肯定拥有每个边界框的坐标。对于每个边界框,您只需将遮罩中的区域替换为边界框所包围的区域,如下所示:


掩码[y:y+h,x:x+w]=图像[y:y+h,x:x+w],其中掩码是您的最终输出和所需结果,图像是要进行处理的输入图像。x、y、w、h的值对于两幅图像都是相同的,因为我们已经确保遮罩和输入图像的尺寸是相同的。

如注释中所述,如果您有ROI的位置,您可以使用它们将它们粘贴到具有与原始图像相同形状的白色背景的图像上

import cv2
import numpy as np

image = cv2.imread(r'C:\Users\Desktop\rus.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
white_bg = 255*np.ones_like(image)

ret, thresh = cv2.threshold(gray, 60, 255, cv2.THRESH_BINARY_INV)
blur = cv2.medianBlur(thresh, 1)
kernel = np.ones((10, 20), np.uint8)
img_dilation = cv2.dilate(blur, kernel, iterations=1)
im2, ctrs, hier = cv2.findContours(img_dilation.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

sorted_ctrs = sorted(ctrs, key=lambda ctr: cv2.boundingRect(ctr)[0])
for i, ctr in enumerate(sorted_ctrs):
    # Get bounding box
    x, y, w, h = cv2.boundingRect(ctr)
    roi = image[y:y + h, x:x + w]
    if (h > 50 and w > 50) and h < 200:

        cv2.rectangle(image, (x, y), (x + w, y + h), (255, 255, 255), 1)        
        cv2.imshow('{}.png'.format(i), roi)

        #--- paste ROIs on image with white background 
        white_bg[y:y+h, x:x+w] = roi

cv2.imshow('white_bg_new', white_bg)
cv2.waitKey(0)
cv2.destroyAllWindows() 
导入cv2
将numpy作为np导入
image=cv2.imread(r'C:\Users\Desktop\rus.png')
灰色=cv2.CVT颜色(图像,cv2.COLOR\u BGR2GRAY)
白色\u bg=255*np.类白色(图)
ret,thresh=cv2.阈值(灰色,60255,cv2.thresh\u二进制\u INV)
模糊=cv2.中间模糊(阈值,1)
内核=np.ones((10,20),np.uint8)
img_displate=cv2.displate(模糊、核、迭代次数=1)
im2,CTR,hier=cv2.findContours(img_dictional.copy(),cv2.RETR_树,cv2.CHAIN_近似简单)
排序的\u ctrs=sorted(ctrs,key=lambda ctr:cv2.boundingRect(ctr)[0])
对于i,枚举中的ctr(排序的ctr):
#获取边界框
x、 y,w,h=cv2.boundingRect(ctr)
roi=图像[y:y+h,x:x+w]
如果(h>50和w>50)和h<200:
cv2.矩形(图像,(x,y),(x+w,y+h),(255,255,255),1)
imshow(“{}.png.”格式(i),roi)
#---在具有白色背景的图像上粘贴ROI
白色背景[y:y+h,x:x+w]=roi
cv2.imshow(“白色背景新”,白色背景)
cv2.等待键(0)
cv2.destroyAllWindows()
结果是:


提示,所有不应变为白色的单元格A)不是洋红色,b)在其上方、左侧、右侧和下方(即不在任何边界框内)至少有一个洋红色单元格。是否绘制了这些矩形的坐标?@Link您可以微调结果以分离出数字。但我希望你能明白!1@Link您希望输出结果如何?您可以在二进制阈值图像上执行与well@Link其主要思想是将ROI粘贴到所选坐标
white\u bg[y:y+h,x:x+w]=ROI
aaaa中,没有任何内容,您是对的。很抱歉但我会等待一个面具解决方案(代码)LOLanyway@Link你说的面膜溶液是什么意思?您可以对二进制阈值图像而不是原始图像执行相同的操作!