根据像素值裁剪 rgb 图像

to crop the rgb image based on the pixel value

我有一张 rgb 图像,我想从各个方面裁剪它。我已经在灰度图像上尝试了下面的代码,它可以工作,但对于 RGB 图像却没有。 我的代码是:

    import cv2 
    import numpy as np
    import glob,os
    from PIL import Image
    
    inputdir = "/Users/sripdeep/Desktop/Projects/3 Norm_Sub_Norm/rgb/"
    outpath = "/Users/sripdeep/Desktop/Projects/3 Norm_Sub_Norm/rgb_norm/"
    
    #filesname = sorted(glob.glob( inputdir + "*.jpg"))
    
    for img1 in sorted(glob.glob( inputdir + "*.jpeg")):
        
        img_path = img1.split('/')[-1]
        imgstr = img_path.split('.')[0]
        
        print(imgstr)
        im1 = cv2.imread(img1,0)
        thresh = cv2.threshold(im1, 100, 255, cv2.THRESH_BINARY)[1]
        x, y, w, h = cv2.boundingRect(im1)           #  calculates nonzero pixels 
#        print(x,y,w,h)
#        a tuple (x, y, w, h) with (x, y) the upper left point 
#        as well as width w and height h of the bounding rectangle.

        left = (x, np.argmax(thresh[:, x]))             # 
        right = (x+w-1, np.argmax(thresh[:, x+w-1]))    # 
        top = (np.argmax(thresh[y, :]), y)              # 
        bottom = (np.argmax(thresh[y+h-1, :]), y+h-1) 
        
        print('left: {}'.format(left))
        print('right: {}'.format(right))
        print('top: {}'.format(top))
        print('bottom: {}'.format(bottom))
        
#        cropped__img = img[y1:y2, x1:x2]
        cropped__img = thresh[top[1]:bottom[1], left[0]:right[0]]
        cropped__img = cv2.resize(cropped__img, (256,256), interpolation=cv2.INTER_LINEAR)
        
        save_fname = os.path.join(outpath, os.path.basename(imgstr)+'.jpg')
        cv2.imwrite(save_fname, cropped__img)

我希望我的图片像这样裁剪:

但我得到的输出是:

你的方法很接近,可以稍微简化一下。

请注意,cv2.boundingRect(..) 只能应用于单通道图像。因此,似乎最简单的方法是首先读取彩色图像,然后将其转换为灰度图像以计算出边界矩形 (x,h,w,h) 坐标 (x1, y1, x2, y2),然后对图像进行裁剪原始彩色图像。 也许是这样的:

im1 = cv2.imread(img1,0) # color image
im1_gray = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY) # grayscale
thresh = cv2.threshold(im1_gray, 100, 255, cv2.THRESH_BINARY)[1] # threshold image
x, y, w, h = cv2.boundingRect(thresh) # find the bounding rectangle of nonzero points in the image
cropped__img = im1[y:y+h, x:x+w,:] # crop the original color image

这个非常简单。 Python 中 OpenCV 中的彩色图像是一个 3 维 NumPy 数组(x,y,颜色)。一张灰度图是一个二维数组(x, y)。

在这一行中,您通过限制 x 和 y 维度来裁剪灰度 (2D) 图像:

cropped__img = thresh[top[1]:bottom[1], left[0]:right[0]]

有关 Python 中切片表示法的更多信息,请参阅 this answer。要裁剪彩色图像,您需要告诉 Python 通过简单地使用 :

抓取三维空间中的 所有内容
#                                                      v 
cropped__img = img[top[1]:bottom[1], left[0]:right[0], :]