第6回 課題解答

元画像の例

課題1 : リサイズとグレースケール化

import cv2
 
# 画像を読み込む
image = cv2.imread('source.jpg')
 
# アスペクト比を保ったまま横幅が800ピクセルになるようにリサイズ
height, width = image.shape[:2]
aspect_ratio = width / height
image = cv2.resize(image, (800, int(800 / aspect_ratio)))
 
# 画像をグレースケール化する
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
 
# 画像を保存する
cv2.imwrite('1.png', image)
1

課題2 : 二値化

import cv2
 
# 画像を読み込む
image = cv2.imread('1.png')
 
# サイズを取得する
height, width = image.shape[:2]
 
# 画像を二値化する
_, image50 = cv2.threshold(image, 50, 255, cv2.THRESH_BINARY)
_, image100 = cv2.threshold(image, 100, 255, cv2.THRESH_BINARY)
_, image150 = cv2.threshold(image, 150, 255, cv2.THRESH_BINARY)
 
# 画像を保存する
cv2.imwrite('2_50.png', image50)
cv2.imwrite('2_100.png', image100)
cv2.imwrite('2_150.png', image150)
2_50


2_100


2_150

課題3 : ランダムディザリング

import cv2
import random
 
# 画像を読み込む
image = cv2.imread('1.png')
 
# サイズを取得する
height, width = image.shape[:2]
 
# すべてのピクセルについての繰り返し
for y in range(height):
  for x in range(width):
    # 閾値をランダムに決める
    threshold = random.randint(0, 255)
    # 閾値を超えたら白にする
    if image[y, x][0] > threshold:
      image[y, x] = [255, 255, 255]
    # 閾値を超えなかったら黒にする
    else:
      image[y, x] = [0, 0, 0]
 
# 画像を保存する
cv2.imwrite('3.png', image)
3

課題4 : 組織的ディザリング

import cv2
import random # この行は削除してもよい
 
# 画像を読み込む
image = cv2.imread('1.png')
 
# サイズを取得する
height, width = image.shape[:2]
 
# Bayer型マスク
mask = [[0, 8, 2, 10],
        [12, 4, 14, 6],
        [3, 11, 1, 9],
        [15, 7, 13, 5]]
 
# すべてのピクセルについての繰り返し
for y in range(height):
  for x in range(width):
    # マスクに応じて閾値を決める
    threshold = mask[y % 4][x % 4] * 16 + 8
    # 閾値を超えたら白にする
    if image[y, x][0] > threshold:
      image[y, x] = [255, 255, 255]
    # 閾値を超えなかったら黒にする
    else:
      image[y, x] = [0, 0, 0]
 
# 画像を保存する
cv2.imwrite('4.png', image)
4