Python 用黑像素阈值裁剪图像

Python 用黑像素阈值裁剪图像,python,image,image-processing,Python,Image,Image Processing,我有一个这样的形象 在图像的上半部分,我想裁剪一些不相关的空间。我在这里做了标记: 前几行中黑色像素的数量大致相同 所以我的想法是在这张图像的行中循环,从最上面的第0行开始,然后检查第+10行是否有相同数量的黑色像素 如果是,继续,如果不是,这是断点 然而,我无法让它工作。这是我的密码 for i in range(img.shape[0]): low = sum(np.bincount(img[i,:])[0:5]) # number of black pixels high

我有一个这样的形象

在图像的上半部分,我想裁剪一些不相关的空间。我在这里做了标记:

前几行中黑色像素的数量大致相同

所以我的想法是在这张图像的行中循环,从最上面的第0行开始,然后检查第+10行是否有相同数量的黑色像素

如果是,继续,如果不是,这是断点

然而,我无法让它工作。这是我的密码

for i in range(img.shape[0]):
    low = sum(np.bincount(img[i,:])[0:5]) # number of black pixels
    high = sum(np.bincount(img[i+10,:])[0:5]) #number of black pixels in row i+10
    #print(i)
    if(low-low*0.01 < high):
        print(i)
        break
使用np.bincount I求五个最暗像素的总数0=黑色,255=白色

然后循环直到找到断点

通过对阈值级别的实验,我发现它要么输出0,要么输出的数字太高


有什么更好的方法可以做到这一点?

在openCV中裁剪图像

crop_img = img[200:400, 100:300]
其中100和300是图像裁剪的宽度和高度,200和400是图像裁剪的左上坐标

速度很慢,但很有效。首先,从左向右移动以找到黑色像素和其他像素之间的边界。然后从右向左移动,找到黑色和其他像素之间的边界。最后我们得到了两个边界列表,即左_数据和右_数据。 从第一行开始,检查左边界和右边界之间的距离,移动直到距离相同,然后停止。最后得到所需图像的四个角点

原始图像

结果图像

crop_img = img[200:400, 100:300]
import cv2

image =  cv2.imread('sample.png') #Test Image
image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)

height = image.shape[0]
width = image.shape[1]

Black = 0
left = 0
right = 0

data_left = [] #left boundary
data_right = [] #right boundary
for i in range(height):
    for j in range(width-1):
        first = image[i][j]
        second = image[i][j+1]
        if(first==Black and second!=Black):
            left=j
    data_left.append(left)

for i in range(height):
    j = width-1
    found = 0
    while(found==0 and j>=0):
        first = image[i][j]
        second = image[i][j-1]
        if(first==Black and second != Black):
            right = j
            found = 1
        j = j-1
    data_right.append(right)        
left_start = [0,data_left[0]]
right_start = [0,data_right[0]]
left_end = 0
right_end = 0

i = 0
found = 0
while(i<len(data_left) and found == 0):
    if((data_left[i]==left_start[1] and data_right[i]==right_start[1])==False):
        found = 1
        left_end = [i,data_left[i]]
        right_end = [i,data_right[i]]
    i = i+1 

width = data_right[0]-data_left[0]
height = left_end[0]
pos_y = 0
pos_x = data_left[0]
crop_image = image[pos_y:pos_y+height, pos_x:pos_x+width]
cv2.imwrite('result.jpg',crop_image) # result image