簡體   English   中英

通過黑色像素閾值裁剪圖像

[英]cropping image by black pixel threshold

我有這樣的圖像

在此處輸入圖片說明

在圖像的上部,我想裁剪一些不相關的空間。 我在這里標記:

在此處輸入圖片說明

前幾行中的黑色像素數量大致相同。

所以我的想法是從頂部(第0行)開始遍歷該圖像的各行,然后檢查row + 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

然后裁剪圖像:

imcrop = img[int(0+i):,:]

使用np.bincount我求和五個最暗像素的數量(0 =黑色,255 =白色)

然后循環直到找到斷點。

通過試驗閾值水平,我發現它要么輸出0,要么輸出的數字太高。

有什么更好的方法可以做到這一點?

相當慢,但是有效。 首先,從左到右移動以找到黑色像素和其他像素之間的邊界。 之后,從右向左移動以找到黑色和其他像素之間的邊界。 最后,我們得到兩個邊界列表,分別為left_data和right_data。 從第一行檢查左邊界到右邊界之間的距離,然后移動直到距離相同,然后停止。 最后,我們得到所需圖像的四個角。

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

原始圖片

在此處輸入圖片說明

結果圖像

在此處輸入圖片說明

在openCV中裁剪圖像

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

其中100和300是圖像裁剪的寬度和高度,200和400是圖像裁剪的左上角坐標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM