openCV

【OpenCV】で組織的ディザリング(python)

組織的ディザリング

これまで見てきた、ディザリングは閾値が固定であったのに対し、組織的ディザリングは閾値を位置によって変化させる手法です

ディザリング表は一般的に以下が利用されます。

元の画像
組織的ディザリング

基本的な使い方

まず、ディザリング表の0から15までの数字に4の2乗をかけて「0から255」に変換し、その値を閾値とします。

そして、縦横4区切りずつに、ディザリング表で算出した「0から255」の閾値で2値化を行なっていきます。

つまり組織的ディザリングでは縦横の4画素ごとに閾値が変化していきます

 

サンプルコード

import cv2
import numpy as np
import random as rand

file_cat = 'img/cat.jpg'

gray = cv2.imread(file_cat , 0) #グレースケール

height, width = gray.shape # 高さ・幅取得

# ディザリング表
matrix = [[0, 8, 2, 10],[12, 4, 14, 6], [3, 11, 1, 9], [15, 7, 13, 5]]


for i in range(4):
    for j in range(4):
        matrix[i][j] = matrix[i][j] * 16

for i in range(height):
    for j in range(width):
        if gray[i][j] < matrix[i % 4][j % 4]: # 4区切りずつ判定する
            gray[i][j] = 0
            
        else:
            gray[i][j] = 255
            
while 1:
    cv2.imshow("gray", gray)
    
    k = cv2.waitKey(1)
    
    if k == ord('q'): # Qキーが押されたら終了
        break
        
cv2.destroyAllWindows()