天天看點

均勻裁剪圖檔(3000X3000到1000X1000)

原圖尺寸:3000X3000

均勻裁剪圖檔(3000X3000到1000X1000)

裁剪後的圖檔尺寸:1000X1000

均勻裁剪圖檔(3000X3000到1000X1000)
均勻裁剪圖檔(3000X3000到1000X1000)

一、運作代碼命名為 cut.py

二、1.jpg 是需要進行裁剪的圖檔

三、Cut 檔案夾儲存按裁剪順序重新命名的圖檔

均勻裁剪圖檔(3000X3000到1000X1000)

完整代碼

import cv2
import glob
import sys
import os
import numpy as np


#儲存切割的左上角坐标
def all_dot(w,h,new_w,new_h):
    if w % new_w !=0 or h % new_h != 0:
        print("原圖無法充分裁剪")
        sys.exit()#退出程式
    dot_list=[]#儲存裁剪圖的左上角坐标
    x = int(w/new_w) #縱切
    y = int(h/new_h) #橫切
    [x1,y1]=[0,0]#從原圖左上角開始
    for k in range(int(x*y)):
        dot_list.append([x1,y1])
        x1 = x1 + new_w
        if (k+1) % x == 0:
            x1 = 0
            y1 = y1 + new_h
    print("一共可以裁成%d張寬為%d,長為%d的圖"%(len(dot_list),new_w,new_h))
    print(dot_list)
    return dot_list        

def plot_rectangle(img_dir,new_w,new_h,count):    
    img = cv2.imread(img_dir,cv2.IMREAD_COLOR)#按彩色圖讀入
    w=img.shape[1]
    h=img.shape[0]
    print("原圖寬為%d,高為%d"%(w,h),'\n')
    dots = all_dot(w,h,new_w,new_h)
    for i in range(len(dots)):#可以生成的圖檔數量
        x0=dots[i][0]
        y0=dots[i][1]
        x1=dots[i][0]+new_w
        y1=dots[i][1]+new_h
        cut_save_image(img,x0,y0,x1,y1, count+i)#顯示裁剪框注釋這一行
        #img表示圖像,兩坐标分别左上(x0,y0)、右下坐标(x1,y1),(0,0,255)為顔色,2為框粗
        #cv2.rectangle(img,(dots[i][0],dots[i][1]),(dots[i][0]+new_w,dots[i][1]+new_h),(0,255,255), 2)#開始裁剪注釋這一行            
        #cut_save_image(img,x0,y0,x1,y1, count+i)
    cv2.imshow('tx',img)
    cv2.waitKey(5000)
    cv2.destroyAllWindows()

 
def cut_save_image(img,x0,y0,x1,y1,k):
    cut_img = img[y0:y1,x0:x1]
    #儲存裁剪後圖檔的路徑
    cv2.imwrite("C:/Users/Chengguo/Desktop/Cut/%08d.jpg"%k,cut_img,[100])#[100]完整寫入
        
def main():
    count=0
    #被裁剪圖檔的路徑
    imgpath='C:/Users/Chengguo/Desktop/'    
    for jpgfile in glob.glob(imgpath+"*.jpg"):#傳回所有比對的圖檔路徑清單
        print(jpgfile)            
        plot_rectangle(jpgfile,1000,1000,count)
        count=count+12
            
    print("\n","一共%d張圖檔"%count)
    

if __name__== '__main__':
    main()  
    
    
    
           

繼續閱讀