フォトカートゥーン化

12512 ワード

ステップ1:画像の色を減らす
2重フィルタは、エッジを明瞭に保ちながら平坦な領域を平滑化することができるので、RGB画像をカートゥーンに変換するのに適している.速度が遅いように見えるが、いくつかのテクニックは、1回の大きな2重フィルタではなく、num_bilateral=7回の繰り返し(例えば、num_bilateral=7回の)によって小さな2重フィルタを適用することである.
import cv2
 
num_down = 2       #          
num_bilateral = 7  #          
 
img_rgb = cv2.imread("img_example.jpg")
 
#           
img_color = img_rgb
for _ in xrange(num_down):
    img_color = cv2.pyrDown(img_color)
 
#                   
for _ in xrange(num_bilateral):
    img_color = cv2.bilateralFilter(img_color, d=9,
                                    sigmaColor=9,
                                    sigmaSpace=7)
 
#           
for _ in xrange(num_down):
    img_color = cv2.pyrUp(img_color)

cv2.bilateralFilterの3つのパラメータは、画素近傍の直径(d)および色空間におけるフィルタの標準偏差(sigmaColor)および座標空間(sigmaSpace)を制御する.
ステップ2:グレースケールに変換し、中値フィルタでノイズを減らす
OpenCVはエッジ検出において多様な選択を提供し,適応しきい値処理の利点は画像の各小領域において最も際立った特徴を検出でき,画像全体の属性とは独立していることである.
中値フィルタを適用して画像の色を減らします.元のカラーピクチャをグレースケールピクチャに変換し、次に中値ブラーを適用してグレースケール画像のノイズを低減します.
#                
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)
img_blur = cv2.medianBlur(img_gray, 7)

手順3:ノイズを低減したプロファイルを作成すると、適応しきい値を安全に適用してプロファイルを作成できます.画像ノイズがある場合でも、blockSize=9のcv 2.ADAPTIVE_THRESH_MEAN_Cアルゴリズムはまた、閾値を9 x 9近傍の平均値からC=2を減算することを保証する.
#             
img_edge = cv2.adaptiveThreshold(img_blur, 255,
                                 cv2.ADAPTIVE_THRESH_MEAN_C,
                                 cv2.THRESH_BINARY,
                                 blockSize=9,
                                 C=2)

ステップ4:輪郭とカラー画像をマージする
最後のステップは、処理されたカラー画像(img_color)をエッジマスク(img_edge)と組み合わせることである.これで、画像を漫画化できる元のコードが書き終わります.画像の効果は少し理工の審美で、文芸に足りなくて、効果の上でPhotoshopに負けて、しかし効率の上で1城を引き返します.
#        
img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB)
img_cartoon = cv2.bitwise_and(img_color, img_edge)
 
#     
cv2.imshow("cartoon", img_cartoon)

最後に、上記のコードを関数にカプセル化します.pythonのosモジュールをインポートしてファイル処理を容易にします.
# -*- coding: utf-8 -*-

import cv2
import os


def cartoonise(picture_name):

    imgInput_FileName = picture_name
    imgOutput_FileName = "D:\pythonpractice\CartoonImage\cartoon" + picture_name
    num_down = 2         #         
    num_bilateral = 7    #         
    img_rgb = cv2.imread(imgInput_FileName)     #    
    #          
    img_color = img_rgb
    for _ in xrange(num_down):
        img_color = cv2.pyrDown(img_color)
    #                  
    for _ in xrange(num_bilateral):
        img_color = cv2.bilateralFilter(img_color,d=9,sigmaColor=9,sigmaSpace=7)
    #          
    for _ in xrange(num_down):
        img_color = cv2.pyrUp(img_color)
    #                
    img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)
    img_blur = cv2.medianBlur(img_gray, 7)
    #            
    img_edge = cv2.adaptiveThreshold(img_blur,255,
                                     cv2.ADAPTIVE_THRESH_MEAN_C,
                                     cv2.THRESH_BINARY,
                                     blockSize=9,
                                     C=2)
    #       
    img_edge = cv2.cvtColor(img_edge, cv2.COLOR_GRAY2RGB)
    img_cartoon = cv2.bitwise_and(img_color, img_edge)
    #         
    cv2.imwrite(imgOutput_FileName, img_cartoon)


ImageList = []  #    List
#    "D:\pythonpractice\Image"     
for filename in os.listdir(r"D:\pythonpractice\Image"):   
    ImageList.append(filename)      #       ImageList
for i in ImageList:   #    ImageList     ,         
    print("     " + i)
    cartoonise(i)