数字の低解像度化

数字の低解像度化

低解像度化

下記の数字の元画像「0」を低解像度化を行う。上記はWは解像度を何分の一にするかのファクタであり、今回は原画像は256×256を8×8へ低解像度化するためにW=32とする。

利用するモジュール

今回は画像を扱うため「opencv」のモジュールを利用する。また、画像を扱う上でベクトルや行列を利用するため、効率的に計算ができる「numpy」を利用する。下記コマンドにてインストールを行う。

pip install opencv-python
pip install numpy
Advertisement

画像ファイルを読み込む

下記のコードにて画像を読み込む。ファイルは「number」というディレクトリに入っているとし、nは読み込む数字を表す。今回は「0」のためn=1だが、「0」から「9」の画像を読み込む場合は、n=10となる。

import cv2

def graying(filename):
    img = cv2.imread("number/" + filename + ".pgm", 0)

n = 1
for filename in range(0,n):
    filename = str(filename)
    graying(filename)

低解像度化

下記コードにて低解像度化を行った。

import cv2
import numpy as np

def graying(filename):
    img = cv2.imread("number/" + filename + ".pgm", 0) 
    ori_height,ori_width = img.shape#(height, width)
    return img, ori_height, ori_width

def low_resolution(filename,img, ori_height, ori_width):
    w=32
    lri_width = int(ori_width / w)
    lri_height = int(ori_height / w)
    out_img=np.zeros((ori_height,ori_width))
    in_img = np.ones((ori_height+w,ori_width+w))*255
    for p in range(ori_height):
        for q in range(ori_width):
            in_img[p,q]=img[p,q]
            num=0
            for i in range(0,w):
                for j in range(0,w):
                    for m in range(0, lri_height):
                        for n in range(0, lri_width):
                            insertion =0
                            insertion = in_img[w*m+i:w+w*m+i,w*n+j:w+w*n+j]
                            out_img[w*m:w+w*m,w*n:w+w*n] = insertion.sum()/w/w
                        cv2.imwrite("lri/" +filename + "/" + filename + "_" + str(num) +".pgm", out_img)
                        print("Saved the image:" + "lri/" + filename + "/" + filename + "_" + str(num) +".pgm")
                        num += 1

for filename in range(0,10):
    filename = str(filename)
    img, ori_height, ori_width = graying(filename)
    low_resolution(filename,img,ori_height,ori_width)
print("Pixelize (Low Resolution) Image:Complete!")

工夫すればもう少し簡易的に記述できると思う。

Pythonカテゴリの最新記事