PYTHON程式語言的學習-10: 檔案的應用


  1. 開一圖片檔案
  2. 非文字檔案無法用一般的方式開啟。
    FR=open('square-200.png','r')
    a=FR.read()
    print(a)
    print(type(a))
    
    UnicodeDecodeError Traceback (most recent call last)
    Input In [3], in ()
          1 FR=open('square-200.png','r')
    ----> 2 a=FR.read()
          3 print(a)
          4 print(type(a))
    
    UnicodeDecodeError: 'cp950' codec can't decode byte 0x89 in
     position 0: illegal multibyte sequence
    



  3. 用cv2.read()讀入圖檔,cv2.write()寫出圖檔
  4. 利用opencv這個模組我們可以把圖片讀進來,cv2.read(),並且加以修改:cv2.rectangle(img2, (XM,YM), (XE,YE), (0, 255, 0), 2) #畫一個矩形,img2=圖檔,裡面的兩個坐標分別是左上角(XM,YM)跟右下角的座標(XE,YE)。第三個是關於顏色的編碼(0, 255, 0)=(B,R,G),2=矩形框線的寬度,最後再用cv2.write('square-200R-G.png',img2)寫出至檔名=square-200R-G.png的圖檔,格式為png(由副檔名決定他的格式,可以是png, JPG等等)。
    FR=open('FILE01.txt','r')
    a=FR.read()
    print(a)import numpy as np
    import cv2
    img = cv2.imread('square-200R.png')
    LY=img.shape[0]; LX=img.shape[1]
    print('type=',type(img))
    print('shape=',img.shape,'   ndim=',np.ndim(img))
    cv2.imshow('Img1', img)
    img2=np.copy(img)
    XM,YM,XE,YE=70,70,120,120
    print(XM,YM,XE,YE)
    cv2.rectangle(img2, (XM,YM), (XE,YE), (0, 255, 0), 2)
    cv2.imshow('Img2', img2)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    cv2.imwrite('square-200R-G.png',img2)
    
    type= 
    shape= (200, 200, 3)    ndim= 3
    70 70 120 120
    



  5. 連續產生圖片
  6. 利用迴圈我們可以連續產生10張圖片,每一個圖片的內容當中全部都是以白色為底,在平面中選擇一個位置畫上一個紅色的矩形,矩形的位置由亂數決定。程式的執行程序如下:
    import numpy as np
    import cv2
    
    img = cv2.imread('square-200R.png')
    LY=img.shape[0]; LX=img.shape[1]
    LX2=LX-40; LY2=LY-40
    print('shape=',img.shape,'   ndim=',np.ndim(img))
    img2=np.full_like(img, 255)
    XM,YM,XE,YE=70,70,80,80
    for p in range(10):
        XM=int(LX2*(random.random()))+10
        YM=int(LY2*(random.random()))+10
        XE=XM+16; YE=YM+16    
        img2=np.full_like(img, 255)
        cv2.rectangle(img2, (XM,YM), (XE,YE), (0, 0, 255), 1)
        for i in range(XM,XE):
            for j in range(YM,YE):
                img2[j][i][0]=0
                img2[j][i][1]=0
                img2[j][i][2]=255        
        cv2.imshow('Img2', img2)    
        FL='SQ200_'+f'{p:02d}'+'.png'
        print(FL,XM,YM,XE,YE)
        cv2.imwrite(FL,img2)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    shape= (200, 200, 3)    ndim= 3
    SQ200_00.png 61 17 77 33
    SQ200_01.png 123 22 139 38
    SQ200_02.png 169 157 185 173
    SQ200_03.png 136 133 152 149
    SQ200_04.png 68 118 84 134
    SQ200_05.png 131 86 147 102
    SQ200_06.png 19 110 35 126
    SQ200_07.png 62 107 78 123
    SQ200_08.png 77 162 93 178
    SQ200_09.png 42 133 58 149
    



  7. 將檔案的數據重新分析處理之後再儲存
  8. 將上面產生的數據從檔案當中讀進來,並且將數據重新計算再輸出到新的檔案當中。執行的程序如下:
    import numpy as np
    import cv2
    
    def Rsquare(img,LX,LY):
        XM=0; YM=0
        for j in range(1,LY):
            for i in range(1,LX):
                i1=i-1
                K1=int(img[j][i1][0])+int(img[j][i1][1])
                   +int(img[j][i1][2])
                K2=int(img[j][i][0])+int(img[j][i][1])
                   +int(img[j][i][2])
                if(abs(K1-K2) > 100): 
                    if(XM==0 and YM==0): XM=i; YM=j
                    XE=i; YE=j  
        return XM,YM,XE,YE
    
    for p in range(10):
        FL='SQ200_'+f'{p:02d}'+'.png'
        img2 = cv2.imread(FL)
        LY=img2.shape[0]; LX=img2.shape[1]
        XM,YM,XE,YE=Rsquare(img2,LX,LY)
        cv2.rectangle(img2, (XM,YM), (XE,YE), (0, 255, 155), 1)
        cv2.imshow('Img2', img2)
        XC=int((XM+XE)/2); YC=int((YM+YE)/2)
        print(p,LX,LY,XM,YM,XE,YE,(XM+XE)/2,(YM+YE)/2)
        cv2.rectangle(img2,(XM,YM),(XE,YE),(0,255,0),2)
        cv2.rectangle(img2,(XC-1,YC-1),(XC+1,YC+1),(255,255,255),1)
        cv2.imshow('Img2', img2)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    
    0 200 200 61 17 78 33 69.5 25.0
    1 200 200 123 22 140 38 131.5 30.0
    2 200 200 169 157 186 173 177.5 165.0
    3 200 200 136 133 153 149 144.5 141.0
    4 200 200 68 118 85 134 76.5 126.0
    5 200 200 131 86 148 102 139.5 94.0
    6 200 200 19 110 36 126 27.5 118.0
    7 200 200 62 107 79 123 70.5 115.0
    8 200 200 77 162 94 178 85.5 170.0
    9 200 200 42 133 59 149 50.5 141.0