ゆがんだQRコードの画像を正しい形に補正するプログラムです.QRコードが縦方向に伸縮していて,さらにQRコードが横方向に伸縮している場合に有効なプログラムです.QRコードがそのようにゆがんでいる画像を元に戻したいときに使ってください.
Google ColabでPythonファイルを新規作成し,以下のソースコードをコピーして貼り付けてください.
処理したい画像ファイルをinput.pngだとします.実行するとファイルをアップロードできるので,このファイルをアップロードします.その後,結果の画像output.pngがダウンロードされます.
from google.colab import files
import os
import numpy as np
import cv2
def main():
if os.path.exists('input.png'):
os.remove('input.png')
files.upload()
input=cv2.imread('input.png',cv2.IMREAD_GRAYSCALE)
_,input=cv2.threshold(input,128,255,cv2.THRESH_BINARY)
oldrows,oldcols=input.shape
threshold=(oldrows+oldcols)*0.01
posx=[0]
for x in range(1,oldcols):
n=0
for y in range(0,oldrows):
if input[y,x]!=input[y,x-1]:
n+=1
if n>threshold:
posx.append(x)
posy=[0]
for y in range(1,oldrows):
n=0
for x in range(0,oldcols):
if input[y,x]!=input[y-1,x]:
n+=1
if n>threshold:
posy.append(y)
newrows=len(posy)*8
newcols=len(posx)*8
output=np.zeros((newrows,newcols),dtype=np.uint8)
for yy in range(0,len(posy)):
for xx in range(0,len(posx)):
yy1=posy[yy]
if yy<len(posy)-1:
yy2=posy[yy+1]
else:
yy2=oldrows
xx1=posx[xx]
if xx<len(posx)-1:
xx2=posy[xx+1]
else:
xx2=oldcols
val=input[(yy1+yy2-1)//2,(xx1+xx2-1)//2]
for y in range(yy*8,(yy+1)*8):
for x in range(xx*8,(xx+1)*8):
output[y,x]=val
cv2.imwrite('output.png',output)
files.download('output.png')
if __name__=='__main__':
main()