縦と横それぞれ伸縮したQRコードを補正するプログラム

Tweet


ゆがんだQRコードの画像を正しい形に補正するプログラムです.QRコードが縦方向に伸縮していて,さらにQRコードが横方向に伸縮している場合に有効なプログラムです.QRコードがそのようにゆがんでいる画像を元に戻したいときに使ってください.

Google ColabでPythonファイルを新規作成し,以下のソースコードをコピーして貼り付けてください.

処理したい画像ファイルをinput.pngだとします.実行するとファイルをアップロードできるので,このファイルをアップロードします.その後,結果の画像output.pngがダウンロードされます.


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()


もどる