画像を直接出力するようにした

main
KoyoNoguchi 1 week ago
parent 3da995a6e4
commit 5b28c22a9a
  1. BIN
      3_1_resize.png
  2. 34
      3_1_resize_rotate.py
  3. BIN
      3_1_rotate.png
  4. BIN
      3_2_grayscale.png
  5. 16
      3_2_grayscale.py
  6. 22
      3_3_binarization.py
  7. BIN
      3_3_binarize.png
  8. BIN
      3_4_roi.png
  9. 19
      3_4_roi.py
  10. BIN
      3_5_canny.png
  11. 32
      3_5_edge.py
  12. BIN
      3_5_laplacian.png
  13. BIN
      3_5_sobel.png
  14. 30
      3_6_color_extraction.py
  15. BIN
      3_6_extract_skin.png
  16. BIN
      3_6_skin_mask.png
  17. BIN
      3_7_d2e.png
  18. BIN
      3_7_e2d.png
  19. 33
      3_7_morphology.py

Binary file not shown.

Before

Width:  |  Height:  |  Size: 149 KiB

@ -3,41 +3,19 @@
import cv2 import cv2
# 画像の読み込み(任意のカラー画像を用意し、ファイル名を指定してください)
image_path = 'sample.jpg' image_path = 'sample.jpg'
img = cv2.imread(image_path) img = cv2.imread(image_path)
if img is None: if img is not None:
print("画像を読み込めませんでした。ファイルパスを確認してください。")
else:
# --- 画像サイズ変換 ---
# 元画像の高さと幅を取得
height, width = img.shape[:2] height, width = img.shape[:2]
print(f"{height}x{width}") # サイズ変換
new_width, new_height = width // 2, height // 2
# 縦横を1/2のサイズに計算
new_width = width // 2
new_height = height // 2
# 画像のサイズを変更
resized_img = cv2.resize(img, (new_width, new_height)) resized_img = cv2.resize(img, (new_width, new_height))
cv2.imwrite('3_1_resize.jpg', resized_img)
# --- 画像の回転 --- # 回転
# 回転の中心座標を計算(画像の中心)
center = (width // 2, height // 2) center = (width // 2, height // 2)
# 45度回転するための変換行列を作成(スケールは1.0でそのまま)
rotation_matrix = cv2.getRotationMatrix2D(center, 45, 1.0) rotation_matrix = cv2.getRotationMatrix2D(center, 45, 1.0)
# アフィン変換を適用して画像を回転
rotated_img = cv2.warpAffine(img, rotation_matrix, (width, height)) rotated_img = cv2.warpAffine(img, rotation_matrix, (width, height))
cv2.imwrite('3_1_rotate.jpg', rotated_img)
# --- 結果の表示 ---
cv2.imshow('Original Image', img)
cv2.imshow('Resized Image (1/2)', resized_img)
cv2.imshow('Rotated Image (45 degrees)', rotated_img)
# キー入力待ち(任意のキーを押すとウィンドウが閉じる)
cv2.waitKey(0)
cv2.destroyAllWindows()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 586 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 333 KiB

@ -3,21 +3,9 @@
import cv2 import cv2
# 画像の読み込み(カラー画像を用意し、ファイル名を指定してください)
image_path = 'sample.jpg' image_path = 'sample.jpg'
img = cv2.imread(image_path) img = cv2.imread(image_path)
if img is None: if img is not None:
print("画像を読み込めませんでした。ファイルパスを確認してください。")
else:
# --- グレースケール化 ---
# BGR形式のカラー画像をグレースケールに変換
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imwrite('3_2_grayscale.jpg', gray_img)
# --- 結果の表示 ---
cv2.imshow('Original Color Image', img)
cv2.imshow('Grayscale Image', gray_img)
# キー入力待ち
cv2.waitKey(0)
cv2.destroyAllWindows()

@ -3,29 +3,11 @@
import cv2 import cv2
# 画像の読み込み(3.2と同じ画像を使用)
image_path = 'sample.jpg' image_path = 'sample.jpg'
# 第2引数に 0 (cv2.IMREAD_GRAYSCALE) を指定し、最初からグレースケールとして読み込む
gray_img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) gray_img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if gray_img is None: if gray_img is not None:
print("画像を読み込めませんでした。ファイルパスを確認してください。")
else:
# --- 2値化処理 ---
# 閾値(自身の画像に合わせて0〜255の間で適切な値に調整してください)
threshold_value = 127 threshold_value = 127
# 閾値を超えた画素に割り当てる値(白 = 255)
max_value = 255 max_value = 255
# 2値化を実行
# ret には使用された閾値が、binary_img には2値化後の画像が代入される
ret, binary_img = cv2.threshold(gray_img, threshold_value, max_value, cv2.THRESH_BINARY) ret, binary_img = cv2.threshold(gray_img, threshold_value, max_value, cv2.THRESH_BINARY)
cv2.imwrite('3_3_binarize.jpg', binary_img)
# --- 結果の表示 ---
cv2.imshow('Original Grayscale Image', gray_img)
cv2.imshow('Binarized Image (Threshold: 127)', binary_img)
# キー入力待ち
cv2.waitKey(0)
cv2.destroyAllWindows()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

@ -3,32 +3,17 @@
import cv2 import cv2
# 画像の読み込み(任意の画像を用意してください)
image_path = 'sample.jpg' image_path = 'sample.jpg'
img = cv2.imread(image_path) img = cv2.imread(image_path)
if img is None: if img is not None:
print("画像を読み込めませんでした。ファイルパスを確認してください。")
else:
# 画像の高さ、幅を取得
height, width = img.shape[:2] height, width = img.shape[:2]
# --- ROI(関心領域)の指定 ---
# 切り出す領域の開始位置と終了位置を計算(例として、画像の中心部分を切り出し)
start_y = 248 start_y = 248
end_y = 361 end_y = 361
start_x = 67 start_x = 67
end_x = 208 end_x = 208
# --- 画像の切り出し ---
# NumPy配列のスライス機能を使用して、指定した範囲を切り出す
# 指定順序は [yの開始:yの終了, xの開始:xの終了]
roi_img = img[start_y:end_y, start_x:end_x] roi_img = img[start_y:end_y, start_x:end_x]
cv2.imwrite('3_4_roi.jpg', roi_img)
# --- 結果の表示 ---
cv2.imshow('Original Image', img)
cv2.imshow('ROI (Region of Interest)', roi_img)
# キー入力待ち
cv2.waitKey(0)
cv2.destroyAllWindows()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

@ -3,41 +3,23 @@
import cv2 import cv2
# 画像の読み込み(エッジ検出は通常グレースケール画像に対して行います)
image_path = 'sample.jpg' image_path = 'sample.jpg'
img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
if img is None: if img is not None:
print("画像を読み込めませんでした。ファイルパスを確認してください。") # Sobel
else:
# --- Sobel(ソーベル)フィルタ ---
# X方向の勾配(縦のエッジ)とY方向の勾配(横のエッジ)を計算
# 負の勾配を保持するため、出力データ型を cv2.CV_64F に指定
sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3) sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=3)
sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3) sobel_y = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=3)
# 絶対値を取り、表示可能な8ビット符号なし整数(0〜255)に変換
sobel_x_abs = cv2.convertScaleAbs(sobel_x) sobel_x_abs = cv2.convertScaleAbs(sobel_x)
sobel_y_abs = cv2.convertScaleAbs(sobel_y) sobel_y_abs = cv2.convertScaleAbs(sobel_y)
# X方向とY方向の画像を1:1の割合で合成して全体のエッジ画像を作成
sobel_combined = cv2.addWeighted(sobel_x_abs, 0.5, sobel_y_abs, 0.5, 0) sobel_combined = cv2.addWeighted(sobel_x_abs, 0.5, sobel_y_abs, 0.5, 0)
cv2.imwrite('3_5_sobel.jpg', sobel_combined)
# --- Laplacian(ラプラシアン)フィルタ --- # Laplacian
# 2次微分を用いて全方向のエッジを同時に検出
laplacian = cv2.Laplacian(img, cv2.CV_64F) laplacian = cv2.Laplacian(img, cv2.CV_64F)
laplacian_abs = cv2.convertScaleAbs(laplacian) laplacian_abs = cv2.convertScaleAbs(laplacian)
cv2.imwrite('3_5_laplacian.jpg', laplacian_abs)
# --- Canny(キャニー)法 --- # Canny
# ノイズ除去と2つの閾値処理を組み合わせた、より高精度なエッジ検出アルゴリズム
canny = cv2.Canny(img, 50, 150) canny = cv2.Canny(img, 50, 150)
cv2.imwrite('3_5_canny.jpg', canny)
# --- 結果の表示 ---
cv2.imshow('Original Grayscale', img)
cv2.imshow('Sobel Edge', sobel_combined)
cv2.imshow('Laplacian Edge', laplacian_abs)
cv2.imshow('Canny Edge', canny)
# キー入力待ち
cv2.waitKey(0)
cv2.destroyAllWindows()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 482 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 363 KiB

@ -4,36 +4,16 @@
import cv2 import cv2
import numpy as np import numpy as np
# 画像の読み込み(自身または人物が写っている画像を用意してください)
image_path = 'person.jpg' image_path = 'person.jpg'
img = cv2.imread(image_path) img = cv2.imread(image_path)
if img is None: if img is not None:
print("画像を読み込めませんでした。ファイルパスを確認してください。")
else:
# --- 色空間の変換 ---
# BGR色空間からHSV色空間に変換
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
lower_skin = np.array([0, 20, 70])
upper_skin = np.array([20, 255, 255])
# --- 肌色の範囲を指定 (HSV) ---
# OpenCVにおけるH(色相)は0〜179、S(彩度)とV(明度)は0〜255
# ※画像の色合いや照明条件に合わせて微調整が必要です
lower_skin = np.array([0, 20, 70]) # 下限値 (H, S, V)
upper_skin = np.array([20, 255, 255]) # 上限値 (H, S, V)
# --- マスク画像の作成 ---
# inRange関数を使用して、指定した範囲内の画素を255(白)、それ以外を0(黒)とするマスクを作成
skin_mask = cv2.inRange(hsv_img, lower_skin, upper_skin) skin_mask = cv2.inRange(hsv_img, lower_skin, upper_skin)
# --- 色領域の抽出 ---
# 元画像と元画像をマスクを使って論理積(AND)をとり、肌色の部分だけを残す
extracted_img = cv2.bitwise_and(img, img, mask=skin_mask) extracted_img = cv2.bitwise_and(img, img, mask=skin_mask)
# --- 結果の表示 --- cv2.imwrite('3_6_skin_mask.jpg', skin_mask)
cv2.imshow('Original Image', img) cv2.imwrite('3_6_extract_skin.jpg', extracted_img)
cv2.imshow('Skin Mask', skin_mask)
cv2.imshow('Extracted Skin', extracted_img)
# キー入力待ち
cv2.waitKey(0)
cv2.destroyAllWindows()

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

@ -1,45 +1,28 @@
# 実験課題7 # 実験課題7
# 3.7 膨張・収縮(白黒の2値画像に対する処理へ修正版) # 3.7 膨張・収縮
import cv2 import cv2
import numpy as np import numpy as np
# 画像の読み込み
image_path = 'person.jpg' image_path = 'person.jpg'
img = cv2.imread(image_path) img = cv2.imread(image_path)
if img is None: if img is not None:
print("画像を読み込めませんでした。ファイルパスを確認してください。")
else:
# 3.6の処理:HSV変換
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
# 肌色の範囲を指定
lower_skin = np.array([0, 20, 70]) lower_skin = np.array([0, 20, 70])
upper_skin = np.array([20, 255, 255]) upper_skin = np.array([20, 255, 255])
# inRangeで作成されるこの画像が、対象が白(255)で背景が黒(0)の「2値画像(白黒画像)」です # 2値画像(白黒画像)を作成
mask_img = cv2.inRange(hsv_img, lower_skin, upper_skin) mask_img = cv2.inRange(hsv_img, lower_skin, upper_skin)
# --- 膨張・収縮のための構造要素(カーネル)の定義 --- kernel = np.ones((5, 5), np.uint8)
kernel = np.ones((3, 3), np.uint8)
# --- ① 収縮 3回 → 膨張 3回(オープニング処理) --- # オープニング処理 (収縮 -> 膨張) [Erode to Dilate]
# 処理の対象を mask_img(白黒画像) に変更
eroded_first = cv2.erode(mask_img, kernel, iterations=3) eroded_first = cv2.erode(mask_img, kernel, iterations=3)
seq_opening = cv2.dilate(eroded_first, kernel, iterations=3) seq_opening = cv2.dilate(eroded_first, kernel, iterations=3)
cv2.imwrite('3_7_e2d.jpg', seq_opening)
# --- ② 膨張 3回 → 収縮 3回(クロージング処理) --- # クロージング処理 (膨張 -> 収縮) [Dilate to Erode]
# 処理の対象を mask_img(白黒画像) に変更
dilated_first = cv2.dilate(mask_img, kernel, iterations=3) dilated_first = cv2.dilate(mask_img, kernel, iterations=3)
seq_closing = cv2.erode(dilated_first, kernel, iterations=3) seq_closing = cv2.erode(dilated_first, kernel, iterations=3)
cv2.imwrite('3_7_d2e.jpg', seq_closing)
# --- 結果の表示 ---
# 白黒のマスク画像がどのように変化するかを確認します
cv2.imshow('1. Original Mask (Black & White)', mask_img)
cv2.imshow('2. Erode 3 -> Dilate 3', seq_opening)
cv2.imshow('3. Dilate 3 -> Erode 3', seq_closing)
# キー入力待ち
cv2.waitKey(0)
cv2.destroyAllWindows()
Loading…
Cancel
Save