7Morph_Close_gpu.py

000: import cv2
001: import numpy as np
002: import random
003:
004: def __main():
005: gpuWImg = cv2.cuda_GpuMat() # GPUで画像を使用する準備
006: gpuBImg = cv2.cuda_GpuMat() # GPUで画像を使用する準備
007:
008: size = np.array([720, 1280, 3])
009: whiteColor = np.array([255., 255., 255.])
010: wImg = np.full(size, whiteColor, dtype=np.uint8)
011:
012: blackColor = np.array([0., 0., 0.])
013: bImg = np.full(size, blackColor, dtype=np.uint8)
014:
015: wImg = setCrossLines(wImg, blackColor)
016: wOrg = wImg
017:
018: gpuWImg.upload(wImg) # GPUで編集できるようにイメージをアップロード
019: # ここで処理を実行する
020: # 白ベース画像の処理
021: gpuWImg = getMorpholigy(gpuWImg)
022: wImg = gpuWImg.download() # 元のMatデータに戻す //cuda_Matでは表示できない
023: # 黒ベース画像の処理
024: bImg = setCrossLines(bImg, whiteColor)
025: bOrg = bImg
026: gpuBImg.upload(bImg) # GPUで編集できるようにイメージをアップロード
027: gpuBImg = getMorpholigy(gpuBImg)
028: bImg = gpuBImg.download() # 元のMatデータに戻す //cuda_Matでは表示できない
029:
030: cv2.imshow(‘White Original’, wOrg)
031: cv2.imshow(‘Black Original’, bOrg)
032: cv2.imshow(‘White result’, wImg)
033: cv2.imshow(‘Black result’, bImg)
034: cv2.waitKey(0)
035:
036: cv2.destroyAllWindows()
037:
038: # クロージング処理
039: def getMorpholigy(gpuImg):
040: gpuImg = cv2.cuda.cvtColor(gpuImg, cv2.COLOR_BGR2GRAY) # CUDAを使用してグレースケールに変換する
041: kernel = np.ones((5, 5), np.uint8) # 全要素を1で初期化
042: # 入力/出力画像タイプとして、CV_8UC1、CV_8UC4、CV_32FC1、CV_32FC4が使用可能
043: gpu_filter = cv2.cuda.createMorphologyFilter(op=cv2.MORPH_CLOSE, srcType=cv2.CV_8UC1, kernel=kernel, iterations=3)
044: gpuImg = cv2.cuda_Filter.apply(gpu_filter, gpuImg)
045:
046: return gpuImg
047:
048: # ノイズの描画
049: def __setNoise(img, color):
050: for num in range(400):
051: x = int(random.uniform(10, 1270))
052: y = int(random.uniform(10, 710))
053: angle = (x, y, 3, 3)
054: cv2.rectangle(img, angle, color, -1)
055:
056: return img
057:
058: # クロスラインの描画
059: def setCrossLines(img, color):
060: padding = 100
061: border = 20
062: height, width, channels = img.shape[:3]
063: # color = np.array([0., 0., 0.]) # 色の指定
064: # 水平直線の描画
065: img = cv2.line(img, (padding, int(height / 2)), (width – padding, int(height / 2)), color, border, cv2.LINE_AA)
066: # 垂直直線の描画
067: img = cv2.line(img, (int(width / 2), padding), (int(width / 2), height – padding), color, border, cv2.LINE_AA)
068: # 斜線の描画
069: img = cv2.line(img, (padding, padding), (width – padding, height – padding), color, border, cv2.LINE_AA)
070:
071: __setNoise(img, color)
072:
073: return img
074:
075: if __name__ == “__main__”:
076: print(cv2.__version__)
077:
078: __main()