2014-01-16 77 views
1

試圖通過將座標列表保存到數組中裁剪我的圖像後,裁剪區域中的字母變得非常模糊,我找不到原因。在裁剪功能後字母模糊/模糊

原始圖像看起來像

1

後裁剪圖像看起來像

2

在問題的代碼如下:

import numpy as np 
import cv2 

im2 = cv2.imread('1.jpg') 
im = im2.copy() 

gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
blur = cv2.GaussianBlur(gray,(5,5),0) 
thresh = cv2.adaptiveThreshold(blur,255,1,1,11,2) 


contours,hierarchy = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE) 


squares = [] 

for cnt in contours: 
    if cv2.contourArea(cnt)>50: 
     [x,y,w,h] = cv2.boundingRect(cnt) 

     if h>28 and h<34: 
      rect = (cv2.rectangle(im,(x,y),(x+w,y+h),(255,255,255),3)) 
      squares.append(cv2.boundingRect(cnt)) 
      cv2.imwrite('norm1.jpg',im) 

crop_img = [[[255, 255, 255] for x in xrange(377)] for x in xrange(377) ] 

for s in squares: 
    x = s[0] 
    y = s[1] 
    w = s[2] 
    h = s[3] 
    img = im[y:y+h,x:x+w] 
    for col in range(y,y+h): 
     for row in range(x,x+w): 
      if img[col - y][row - x].tolist() == [0,0,0]: 
       crop_img[col][row] = [0,0,0] 
cv2.imwrite("cropped.jpg", np.array(crop_img)) 

任何幫助WOU ld將不勝感激!

+0

在您的代碼,其是可變的第一和哪個變量是第二。另外我不確定,但請檢查您的數據類型是否在某處發生了更改。 –

+0

嗨,阿比德。我不知道你是什麼意思的「第一和第二」,但我知道我的數據類型是改變了行「if img [col - y] [row - x] .tolist()== [0,0, 0]:「我不得不使用.tolist函數,因爲它拋出了錯誤:ValueError:具有多個元素的數組的真值是不明確的。使用a.any()或a.all()。 我希望這可以清除一些。謝謝! – JamesLLee

+0

噢......我很抱歉,我想問「在你的代碼中,哪個變量是你的問題中的第一個圖像,哪個變量是第二個圖像」。 –

回答

1
import numpy as np 
import cv2 
import matplotlib.pyplot as plt 

im2 = cv2.imread('norm1_zps89266edb.jpg') 
im = im2.copy() 

gray = cv2.cvtColor(im,cv2.COLOR_BGR2GRAY) 
blur = cv2.GaussianBlur(gray,(5,5),0) 
ret3,thresh = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU) 

#we ony want the external contours 
contours,hierarchy = cv2.findContours(thresh.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE) 
#extract the countours with area > 50 
squares = [cnt for cnt in contours if cv2.contourArea(cnt) > 50] 

#mask array with the same shape as img (but only 1 channel) 
mask = np.zeros((im.shape[0], im.shape[1])) 
#draw the contours filled with 255 values. 
cv2.drawContours(mask,squares,-1,255,-1) 

newImage = np.where(mask==255, thresh, 255) 

plt.imshow(newImage) 
plt.show() 

cv2.imwrite("cropped.jpg", newImage) 

輸出:
http://i44.tinypic.com/8yak93.jpg

+0

真棒!非常感謝 – JamesLLee