使用Python OpenCV从图像中删除边框

使用Python OpenCV从图像中删除边框,python,image,opencv,image-processing,computer-vision,Python,Image,Opencv,Image Processing,Computer Vision,我有像下面这样有边框的图片。我可以使用OpenCV或python删除图像中的边框吗 我使用了下面的代码进行裁剪,但它不起作用 copy = Image.fromarray(img_final_bin) try: bg = Image.new(copy.mode, copy.size, copy.getpixel((0, 0))) except: return None diff = ImageChops.difference(copy, bg) diff = ImageChops

我有像下面这样有边框的图片。我可以使用OpenCV或python删除图像中的边框吗

我使用了下面的代码进行裁剪,但它不起作用

copy = Image.fromarray(img_final_bin)
try:
    bg = Image.new(copy.mode, copy.size, copy.getpixel((0, 0)))
except:
    return None
diff = ImageChops.difference(copy, bg)
diff = ImageChops.add(diff, diff, 2.0, -100)
bbox = diff.getbbox()
if bbox:
    return np.array(copy.crop(bbox))


这里有一种使用阈值+轮廓过滤的方法。其思想是通过设置阈值来获得二值图像。从这里我们找到轮廓,并使用最大面积阈值进行过滤。我们绘制所有通过此过滤器的轮廓到空白掩码上,然后执行逐位操作以移除边界。下面是删除边框的结果

导入cv2
将numpy作为np导入
image=cv2.imread('1.png')
掩码=np.zero(image.shape,dtype=np.uint8)
灰色=cv2.CVT颜色(图像,cv2.COLOR\u BGR2GRAY)
thresh=cv2.阈值(灰色,0,255,cv2.thresh\u二进制\u INV+cv2.thresh\u OTSU)[1]
cnts=cv2.查找对象(阈值、cv2.RETR\u树、cv2.链近似值、简单值)
如果len(cnts)==2个其他cnts[1],则cnts=cnts[0]
对于碳纳米管中的碳:
面积=cv2。轮廓面积(c)
如果面积小于10000:
cv2.绘制轮廓(掩模,[c],-1,(255255),-1)
遮罩=cv2.CVT颜色(遮罩,cv2.COLOR\u BGR2GRAY)
结果=cv2.按位_和(图像,图像,掩码=掩码)
结果[掩码==0]=(255255)
cv2.imwrite('result.png',result)
cv2.waitKey()

您也可以使用Werk24的API阅读技术图纸:


从werk24导入W24TechreadClient,W24AskCanvasThumbnail
与W24TechreadClient异步。将_从_env()生成为会话:
response=wait session.read_绘图(文档字节,[W24AskCanvasThumbnail()]))
它还允许您提取度量值等。请参阅:

这应该通过使用轮廓来解决。我得到了错误结果[mask==0]=(255255255)MemoryError:无法分配具有形状(57322428,)和数据类型Int328的数组。我希望在图像内部保留线条。您共享的上述代码可以工作,但会删除或擦除图像中的某些行@Nathancyy您可以尝试调整轮廓区域,以仅删除较大的外部边界
import cv2
import numpy as np

image = cv2.imread('1.png')
mask = np.zeros(image.shape, dtype=np.uint8)
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

cnts = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
    area = cv2.contourArea(c)
    if area < 10000:
        cv2.drawContours(mask, [c], -1, (255,255,255), -1)

mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
result = cv2.bitwise_and(image,image,mask=mask)
result[mask==0] = (255,255,255)

cv2.imwrite('result.png', result)
cv2.waitKey()