可能性の模索

画像の半分づつを合成するツール

ソースコード

  1. import numpy as np
  2. from matplotlib import pyplot as plt
  3. import matplotlib.gridspec as gridspec
  4. from mpl_toolkits.mplot3d import Axes3D
  5. import seaborn as sns
  6. import cv2
  7. import random
  8. # imread(path,-1)でBGRAとして読み込み. ともに(720, 1280, 4)の配列
  9. #画像の読み込み
  10. img1 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/みなとみらい公園.jpg',-1),cv2.COLOR_BGRA2RGBA)
  11. img2 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/伊豆 雪山.jpg',-1),cv2.COLOR_BGRA2RGBA)
  12. img3 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/伊豆.jpg',-1),cv2.COLOR_BGRA2RGBA)
  13. img4 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/横浜 荒野.jpg',-1),cv2.COLOR_BGRA2RGBA)
  14. img5 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/横浜 雪山.jpg',-1),cv2.COLOR_BGRA2RGBA)
  15. img6 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/横浜 夕焼け.jpg',-1),cv2.COLOR_BGRA2RGBA)
  16. img7 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/横浜.jpg',-1),cv2.COLOR_BGRA2RGBA)
  17. img8 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/京都駅 夏.jpg',-1),cv2.COLOR_BGRA2RGBA)
  18. img9 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/京都駅 秋.jpg',-1),cv2.COLOR_BGRA2RGBA)
  19. img10 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/京都駅 春.jpg',-1),cv2.COLOR_BGRA2RGBA)
  20. img11 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/京都駅 冬.jpg',-1),cv2.COLOR_BGRA2RGBA)
  21. img12 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/京都駅.jpg',-1),cv2.COLOR_BGRA2RGBA)
  22. img13 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/銀閣 夏.jpg',-1),cv2.COLOR_BGRA2RGBA)
  23. img14 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/銀閣 秋.jpg',-1),cv2.COLOR_BGRA2RGBA)
  24. img15 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/銀閣 春.jpg',-1),cv2.COLOR_BGRA2RGBA)
  25. img16 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/銀閣 冬.jpg',-1),cv2.COLOR_BGRA2RGBA)
  26. img17 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/銀閣.jpg',-1),cv2.COLOR_BGRA2RGBA)
  27. img18 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/五重塔.jpg',-1),cv2.COLOR_BGRA2RGBA)
  28. img19 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/工事現場 氷山.jpg',-1),cv2.COLOR_BGRA2RGBA)
  29. img20 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/工事現場.jpg',-1),cv2.COLOR_BGRA2RGBA)
  30. img21 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/竹芝ふ頭 荒野.jpg',-1),cv2.COLOR_BGRA2RGBA)
  31. img22 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/竹芝ふ頭 草原.jpg',-1),cv2.COLOR_BGRA2RGBA)
  32. img23 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/竹芝ふ頭.jpg',-1),cv2.COLOR_BGRA2RGBA)
  33. img24 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/長野 夏.jpg',-1),cv2.COLOR_BGRA2RGBA)
  34. img25 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/長野 秋.jpg',-1),cv2.COLOR_BGRA2RGBA)
  35. img26 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/長野 春.jpg',-1),cv2.COLOR_BGRA2RGBA)
  36. img27 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/長野 冬.jpg',-1),cv2.COLOR_BGRA2RGBA)
  37. img28 = cv2.cvtColor(cv2.imread('../../../Desktop/pythonimage/長野.jpg',-1),cv2.COLOR_BGRA2RGBA)
  38. # 画像をランダムで二つ抽出
  39. list = [img1, img2, img3, img4, img5, img6, img7, img8, img9, img10,img11,img12,img13,img14,img15,img16,img17,img18,img19,
  40.            img20,img21,img22,img23,img24,img25,img26,img27,img28]
  41. a = random.choice(list)
  42. b = random.choice(list)
  43. pdr=a
  44. sb=b
  45. # [0,1] に正規化
  46. pdr = pdr / 255
  47. sb = sb / 255
  48. y = pdr.shape[0]
  49. x = pdr.shape[1]
  50. # pdrは右から左、sbは左から右で透過のグラデーションをかける
  51. # pdrを背景, sbを前景にする想定
  52. pdr[:,:,3] = np.linspace(-0.5,1.5,x).repeat(y).reshape(x,y).T.clip(0,1)
  53. sb[:,:,3] = np.linspace(1.5,-0.5,x).repeat(y).reshape(x,y).T.clip(0,1)
  54. # Premultiply(今回は一回だけの合成なのであまり意味がないが)
  55. for (i,ch) in enumerate(['R','G','B']):
  56.     pdr[:,:,i] = pdr[:,:,i] * pdr[:,:,3]
  57.     sb[:,:,i] = sb[:,:,i] * sb[:,:,3]
  58. blended = np.zeros(pdr.shape)
  59. # alphaの式
  60. blended[:,:,3] = sb[:,:,3] + pdr[:,:,3] * (1 - sb[:,:,3])
  61. # RGBの式
  62. for (i,ch) in enumerate(['R','G','B']):
  63.     blended[:,:,i] = sb[:,:,i] + pdr[:,:,i] * (1 - sb[:,:,3])
  64. gs = gridspec.GridSpec(3,2)
  65. fig = plt.figure(figsize=(10,9))
  66. ax1 = fig.add_subplot(gs[0,0])
  67. ax2 = fig.add_subplot(gs[0,1])
  68. ax3 = fig.add_subplot(gs[1:3,:])
  69. ax1.set_xticks([]), ax1.set_yticks([])
  70. ax2.set_xticks([]), ax2.set_yticks([])
  71. # アルファは無視して表示
  72. ax1.set_title('Background')
  73. ax1.imshow(pdr[:,:,:3])
  74. ax2.set_title('Foreground')
  75. ax2.imshow(sb[:,:,:3])
  76. ax3.set_title('Blended')
  77. ax3.imshow(blended[:,:,:3])
  78. plt.show()

プログラム説明

読み込んだ画像ファイルの中からランダムに二つを選び、
半分づつ合成するツール。
最初は画像生成ツールを作ろうとしたが難しかったため、
既存の画像を合成する方向へと変えた。
読み込んでいる画像はフォトショップで編集したため
画像が噛み合うといい感じの画像ができる。


参照サイト

[Python]PythonでOpenCVを使う (基本編)
Python3 & OpenCV で画像処理を学ぶ[4] 〜 アルファブレンドとエンボス効果(画像間演算の基礎)
OpenCV – アルファブレンドで画像を合成する方法
Matplotlibで図の下側に情報を追記する
【Python】リストや文字列の要素をランダムに抽出する(random.choice, choices, sample)