實作碩士論文中,利用BlendMask實例分割模型與高斯-約旦消去法,將QR code與背景圖片做融合,產生有視覺意義的QR code。
根據ISO 18004:2015的規範,QR code定義了不同的版本(level)、容錯等級(correction level)。
根據版本、容錯等級、加入的訊息,遵循QR code的編碼方式,產生最原始、不具視覺意義的QR code。(範例中,版本:5、容錯等級:L、訊息:Aesthetic QR)
![](https://private-user-images.githubusercontent.com/49943356/260782840-165aee33-0df0-4547-b7a4-66c405ae0bf1.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIxODkyMzcsIm5iZiI6MTcyMjE4ODkzNywicGF0aCI6Ii80OTk0MzM1Ni8yNjA3ODI4NDAtMTY1YWVlMzMtMGRmMC00NTQ3LWI3YTQtNjZjNDA1YWUwYmYxLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI4VDE3NDg1N1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTFmMjdmMjcxY2MxNTRhNTdmZmI1MzI2NDgwNzlkYzhkNzQ3OWZhNmQ4MTQ3NTY2MWVkODhjMjZlZTkyYzNjNzAmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.9qjKmm5nFzdpK6pBUfbRyPIMwEBqxq_woT0CDSpUxfQ)
依據傳入的圖片路徑參數,將要加入到QR code內的背景圖片,使用OTSU方法,轉換成二值化影像。
將二值化影像,依據碼元大小,建立一個基於碼元的二值化影像。
利用BlendMask,將背景圖片的ROI(Region of Interest)取出來。
![](https://private-user-images.githubusercontent.com/49943356/260784961-3685f66b-6817-41d1-a9b4-671b9424aca1.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIxODkyMzcsIm5iZiI6MTcyMjE4ODkzNywicGF0aCI6Ii80OTk0MzM1Ni8yNjA3ODQ5NjEtMzY4NWY2NmItNjgxNy00MWQxLWE5YjQtNjcxYjk0MjRhY2ExLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI4VDE3NDg1N1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTUzMTAwMDFhZTE0MjNkYmYzYzQ5M2ZkNzhiZjExYTllOWUzODE2YmY5NjliM2FiYzlhZjJkMjJjM2ZjYjAwMzcmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.MW2XVMcBazESeyl1xRRLdEfi6mpR8DHo2mgPnAnrWvU)
把前面的原始QR code、基於碼元的二值化影像、ROI利用高斯-約旦消去法,將三者結合在一起,產生調整過碼元且看的出圖像輪廓,並且能成功掃描的QR code。
![](https://private-user-images.githubusercontent.com/49943356/260786074-6ad565d9-dfc3-4ec9-8115-47e4fcfb52a4.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIxODkyMzcsIm5iZiI6MTcyMjE4ODkzNywicGF0aCI6Ii80OTk0MzM1Ni8yNjA3ODYwNzQtNmFkNTY1ZDktZGZjMy00ZWM5LTgxMTUtNDdlNGZjZmI1MmE0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI4VDE3NDg1N1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWZkMjU2NTU4NGIzYzZmYjViMGFhZTgxNTA2ZjI0MmNmNmUzMmI1MjA1ZTk0NmM2ZTk2YTJhZmQ1OTk5MzNiMGEmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.ILJ1gDEe9ZyoGsoVRmEwccu2bn9U4DLa8RF9bKZIdWI)
將處理過後的QR code與背景圖片做融合,產生第一步美化過後的QR code。
![](https://private-user-images.githubusercontent.com/49943356/260786333-bd0383ef-db3a-4f54-a3e0-ac398c3067b4.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIxODkyMzcsIm5iZiI6MTcyMjE4ODkzNywicGF0aCI6Ii80OTk0MzM1Ni8yNjA3ODYzMzMtYmQwMzgzZWYtZGIzYS00ZjU0LWEzZTAtYWMzOThjMzA2N2I0LnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI4VDE3NDg1N1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTA0MzRkNGIyODI2MWE0ZWFkNTE4ZTdhOTYxNjhlNDExYWMxY2ZlZGIzMDIxZDMzYmZhMzdlZTE4Mjc3N2M3ZjkmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.BVBi7JUeO48yFM-ggm0T1MlvQ_lHOoAknGLvKfJLB0M)
最後根據QR code的容錯機制與解碼器對於影像的解碼方式,在保有解碼的能力下,刪除一部分碼元,完成美化過後的QR code。
![](https://private-user-images.githubusercontent.com/49943356/260786938-65d13340-4650-43c4-a763-b83e67666b8a.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjIxODkyMzcsIm5iZiI6MTcyMjE4ODkzNywicGF0aCI6Ii80OTk0MzM1Ni8yNjA3ODY5MzgtNjVkMTMzNDAtNDY1MC00M2M0LWE3NjMtYjgzZTY3NjY2YjhhLnBuZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNDA3MjglMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjQwNzI4VDE3NDg1N1omWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPTk1MDkyOWM3OTRjZGZiNzBlMGIzNDQ4NTdmYzkxMDdmMDhjY2M2ZjgxNWI3NzQ1YjU1OTkyOWFmNDhhYTNkYWImWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0JmFjdG9yX2lkPTAma2V5X2lkPTAmcmVwb19pZD0wIn0.kmfX-srLkmvzHfRMz539XlWWAt0GNeKpoF8phhEF34A)
使用方法,執行main.py檔案,並且傳入適當的參數。
python3 main.py v l m o img --mask -ms -s
v: QR code所使用的版本(1~40)。
l: QR code所使用的容錯等級(L, M, Q, H)。
m: 要加入QR code的訊息。
img: 使用的背景圖片之路徑。
o: 輸出圖片要存放之資料夾。
mask: 建立QR code時所使用的mask(0~7)。
ms: 碼元的大小,即每個碼元內會存在多少個pixels。 s: 碼元的切分大小。
參考資料