|
- import cv2
- import numpy as np
- import os
- rate = 1.2
- def nothing(x):
- pass
-
- def vproject(binary):
- h,w = binary.shape
- vprojection = np.zeros(binary.shape,dtype=np.uint8)
- w_w = [0] *w
- for i in range(w):
- for j in range(h):
- if binary[j,i]==0:
- w_w[i] += 1
- average = int(sum(w_w) / w *rate)
- pos = [0,0]
- for i in range(w):
- for j in range(w_w[i]):
- vprojection[j,i]=255
- if pos[0] == 0 and w_w[i] >= average:
- pos[0] = i
- if w_w[i]>= average:
- pos[1] = i
- for i in range(w):
- vprojection[average,i] = 255
- return vprojection,pos
-
- def hproject(binary):
- h,w = binary.shape
- hprojection = np.zeros(binary.shape,dtype=np.uint8)
- h_h=[0]*h
- for i in range(h):
- for j in range(w):
- if binary[i,j] == 0:
- h_h[i] +=1
- average = int(sum(h_h) / h *rate)
- pos = [0,0]
- for i in range(h):
- for j in range(h_h[i]):
- hprojection[i,j] = 255
- if pos[0] == 0 and h_h[i] >= average:
- pos[0] = i
- if h_h[i]>= average:
- pos[1] = i
- for i in range(h):
- hprojection[i,average] = 255
- return hprojection,pos
-
- def bitwise(img):
- h,w= img.shape
- for a in range(h):
- for b in range(w):
- pv = img[a,b]
- img[a,b] = 255 -pv
- return img
-
- def generate(img_path):
- img = cv2.imread(img_path)
- gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
- blurred = cv2.GaussianBlur(gray,(5,1),0)
- gradX = cv2.Sobel(blurred, ddepth=cv2.CV_32F, dx=1, dy=0)
- gradY = cv2.Sobel(blurred, ddepth=cv2.CV_32F, dx=0, dy=1)
-
- gradient = cv2.subtract(gradX, gradY)
- gradient = cv2.convertScaleAbs(gradient)
- res,gradient = cv2.threshold(gradient,80,255,cv2.THRESH_BINARY)
- minus = bitwise(gradient)
- vproj,vpos = vproject(minus)
- hproj,hpos = hproject(minus)
- # cv2.imshow("Canny edgeImage",gradient)
- k = cv2.waitKey(0)
- if k == ord('w') & 0xff:
- cv2.destroyAllWindows()
-
- #裁切
- # cut = img[hpos[0]:hpos[1],vpos[0]:vpos[1]]
- # cut = cv2.resize(cut,(50,100), interpolation=cv2.INTER_AREA)
- #框选
- cut = cv2.rectangle(img,(vpos[0],hpos[0]),(vpos[1],hpos[1]),(0,255,0),2)
- # cv2.imshow("cut",cut)
- # cv2.imshow("vproj",vproj)
- # cv2.imshow("hproj",hproj)
-
- cv2.imwrite("cut-"+img_path,cut);
- k = cv2.waitKey(0)
- if k == ord('w') & 0xff:
- cv2.destroyAllWindows()
-
- def main():
- for filename in os.listdir():
- # print(filename)
- if filename[-4:] == ".jpg":
- generate(filename)
- if __name__ == "__main__":
- main()
|