根据像素值裁剪 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], :]
我有一张 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], :]