diff --git a/3_1_resize.png b/3_1_resize.png deleted file mode 100644 index 0083f67..0000000 Binary files a/3_1_resize.png and /dev/null differ diff --git a/3_1_resize_rotate.py b/3_1_resize_rotate.py index 6c9e9e3..44e4251 100644 --- a/3_1_resize_rotate.py +++ b/3_1_resize_rotate.py @@ -3,41 +3,19 @@ import cv2 -# 画像の読み込み(任意のカラー画像を用意し、ファイル名を指定してください) image_path = 'sample.jpg' img = cv2.imread(image_path) -if img is None: - print("画像を読み込めませんでした。ファイルパスを確認してください。") -else: - # --- 画像サイズ変換 --- - # 元画像の高さと幅を取得 +if img is not None: height, width = img.shape[:2] - print(f"{height}x{width}") - - # 縦横を1/2のサイズに計算 - new_width = width // 2 - new_height = height // 2 - - # 画像のサイズを変更 + # サイズ変換 + new_width, new_height = width // 2, height // 2 resized_img = cv2.resize(img, (new_width, new_height)) + cv2.imwrite('3_1_resize.jpg', resized_img) - # --- 画像の回転 --- - # 回転の中心座標を計算(画像の中心) + # 回転 center = (width // 2, height // 2) - - # 45度回転するための変換行列を作成(スケールは1.0でそのまま) rotation_matrix = cv2.getRotationMatrix2D(center, 45, 1.0) - - # アフィン変換を適用して画像を回転 rotated_img = cv2.warpAffine(img, rotation_matrix, (width, height)) - - # --- 結果の表示 --- - 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() \ No newline at end of file + cv2.imwrite('3_1_rotate.jpg', rotated_img) \ No newline at end of file diff --git a/3_1_rotate.png b/3_1_rotate.png deleted file mode 100644 index 83b479b..0000000 Binary files a/3_1_rotate.png and /dev/null differ diff --git a/3_2_grayscale.png b/3_2_grayscale.png deleted file mode 100644 index 290605e..0000000 Binary files a/3_2_grayscale.png and /dev/null differ diff --git a/3_2_grayscale.py b/3_2_grayscale.py index d415b88..e108cbf 100644 --- a/3_2_grayscale.py +++ b/3_2_grayscale.py @@ -3,21 +3,9 @@ import cv2 -# 画像の読み込み(カラー画像を用意し、ファイル名を指定してください) image_path = 'sample.jpg' img = cv2.imread(image_path) -if img is None: - print("画像を読み込めませんでした。ファイルパスを確認してください。") -else: - # --- グレースケール化 --- - # BGR形式のカラー画像をグレースケールに変換 +if img is not None: gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) - - # --- 結果の表示 --- - cv2.imshow('Original Color Image', img) - cv2.imshow('Grayscale Image', gray_img) - - # キー入力待ち - cv2.waitKey(0) - cv2.destroyAllWindows() \ No newline at end of file + cv2.imwrite('3_2_grayscale.jpg', gray_img) \ No newline at end of file diff --git a/3_3_binarization.py b/3_3_binarization.py index 386f6c6..829676f 100644 --- a/3_3_binarization.py +++ b/3_3_binarization.py @@ -3,29 +3,11 @@ import cv2 -# 画像の読み込み(3.2と同じ画像を使用) image_path = 'sample.jpg' - -# 第2引数に 0 (cv2.IMREAD_GRAYSCALE) を指定し、最初からグレースケールとして読み込む gray_img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) -if gray_img is None: - print("画像を読み込めませんでした。ファイルパスを確認してください。") -else: - # --- 2値化処理 --- - # 閾値(自身の画像に合わせて0〜255の間で適切な値に調整してください) +if gray_img is not None: threshold_value = 127 - # 閾値を超えた画素に割り当てる値(白 = 255) max_value = 255 - - # 2値化を実行 - # ret には使用された閾値が、binary_img には2値化後の画像が代入される ret, binary_img = cv2.threshold(gray_img, threshold_value, max_value, cv2.THRESH_BINARY) - - # --- 結果の表示 --- - cv2.imshow('Original Grayscale Image', gray_img) - cv2.imshow('Binarized Image (Threshold: 127)', binary_img) - - # キー入力待ち - cv2.waitKey(0) - cv2.destroyAllWindows() \ No newline at end of file + cv2.imwrite('3_3_binarize.jpg', binary_img) \ No newline at end of file diff --git a/3_3_binarize.png b/3_3_binarize.png deleted file mode 100644 index f7ba1c6..0000000 Binary files a/3_3_binarize.png and /dev/null differ diff --git a/3_4_roi.png b/3_4_roi.png deleted file mode 100644 index 79f145d..0000000 Binary files a/3_4_roi.png and /dev/null differ diff --git a/3_4_roi.py b/3_4_roi.py index e8fdf2a..6d5872e 100644 --- a/3_4_roi.py +++ b/3_4_roi.py @@ -3,32 +3,17 @@ import cv2 -# 画像の読み込み(任意の画像を用意してください) image_path = 'sample.jpg' img = cv2.imread(image_path) -if img is None: - print("画像を読み込めませんでした。ファイルパスを確認してください。") -else: - # 画像の高さ、幅を取得 +if img is not None: height, width = img.shape[:2] - # --- ROI(関心領域)の指定 --- - # 切り出す領域の開始位置と終了位置を計算(例として、画像の中心部分を切り出し) start_y = 248 end_y = 361 start_x = 67 end_x = 208 - # --- 画像の切り出し --- - # NumPy配列のスライス機能を使用して、指定した範囲を切り出す - # 指定順序は [yの開始:yの終了, xの開始: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() \ No newline at end of file diff --git a/3_5_canny.png b/3_5_canny.png deleted file mode 100644 index fe990e1..0000000 Binary files a/3_5_canny.png and /dev/null differ diff --git a/3_5_edge.py b/3_5_edge.py index cdb2eb9..ded17ed 100644 --- a/3_5_edge.py +++ b/3_5_edge.py @@ -3,41 +3,23 @@ import cv2 -# 画像の読み込み(エッジ検出は通常グレースケール画像に対して行います) image_path = 'sample.jpg' img = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) -if img is None: - print("画像を読み込めませんでした。ファイルパスを確認してください。") -else: - # --- Sobel(ソーベル)フィルタ --- - # X方向の勾配(縦のエッジ)とY方向の勾配(横のエッジ)を計算 - # 負の勾配を保持するため、出力データ型を cv2.CV_64F に指定 +if img is not None: + # Sobel sobel_x = cv2.Sobel(img, cv2.CV_64F, 1, 0, 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_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) + cv2.imwrite('3_5_sobel.jpg', sobel_combined) - # --- Laplacian(ラプラシアン)フィルタ --- - # 2次微分を用いて全方向のエッジを同時に検出 + # Laplacian laplacian = cv2.Laplacian(img, cv2.CV_64F) laplacian_abs = cv2.convertScaleAbs(laplacian) + cv2.imwrite('3_5_laplacian.jpg', laplacian_abs) - # --- Canny(キャニー)法 --- - # ノイズ除去と2つの閾値処理を組み合わせた、より高精度なエッジ検出アルゴリズム + # Canny canny = cv2.Canny(img, 50, 150) - - # --- 結果の表示 --- - 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() \ No newline at end of file + cv2.imwrite('3_5_canny.jpg', canny) \ No newline at end of file diff --git a/3_5_laplacian.png b/3_5_laplacian.png deleted file mode 100644 index 277ae53..0000000 Binary files a/3_5_laplacian.png and /dev/null differ diff --git a/3_5_sobel.png b/3_5_sobel.png deleted file mode 100644 index dd658b9..0000000 Binary files a/3_5_sobel.png and /dev/null differ diff --git a/3_6_color_extraction.py b/3_6_color_extraction.py index 401e463..d59e9de 100644 --- a/3_6_color_extraction.py +++ b/3_6_color_extraction.py @@ -4,36 +4,16 @@ import cv2 import numpy as np -# 画像の読み込み(自身または人物が写っている画像を用意してください) image_path = 'person.jpg' img = cv2.imread(image_path) -if img is None: - print("画像を読み込めませんでした。ファイルパスを確認してください。") -else: - # --- 色空間の変換 --- - # BGR色空間からHSV色空間に変換 +if img is not None: 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) - - # --- 色領域の抽出 --- - # 元画像と元画像をマスクを使って論理積(AND)をとり、肌色の部分だけを残す extracted_img = cv2.bitwise_and(img, img, mask=skin_mask) - # --- 結果の表示 --- - cv2.imshow('Original Image', img) - cv2.imshow('Skin Mask', skin_mask) - cv2.imshow('Extracted Skin', extracted_img) - - # キー入力待ち - cv2.waitKey(0) - cv2.destroyAllWindows() \ No newline at end of file + cv2.imwrite('3_6_skin_mask.jpg', skin_mask) + cv2.imwrite('3_6_extract_skin.jpg', extracted_img) \ No newline at end of file diff --git a/3_6_extract_skin.png b/3_6_extract_skin.png deleted file mode 100644 index fa9fc6a..0000000 Binary files a/3_6_extract_skin.png and /dev/null differ diff --git a/3_6_skin_mask.png b/3_6_skin_mask.png deleted file mode 100644 index 0fc0ad6..0000000 Binary files a/3_6_skin_mask.png and /dev/null differ diff --git a/3_7_d2e.png b/3_7_d2e.png deleted file mode 100644 index 82bd840..0000000 Binary files a/3_7_d2e.png and /dev/null differ diff --git a/3_7_e2d.png b/3_7_e2d.png deleted file mode 100644 index 4da4022..0000000 Binary files a/3_7_e2d.png and /dev/null differ diff --git a/3_7_morphology.py b/3_7_morphology.py index db1dcb9..4bbcb95 100644 --- a/3_7_morphology.py +++ b/3_7_morphology.py @@ -1,45 +1,28 @@ # 実験課題7 -# 3.7 膨張・収縮(白黒の2値画像に対する処理へ修正版) +# 3.7 膨張・収縮 import cv2 import numpy as np -# 画像の読み込み image_path = 'person.jpg' img = cv2.imread(image_path) -if img is None: - print("画像を読み込めませんでした。ファイルパスを確認してください。") -else: - # 3.6の処理:HSV変換 +if img is not None: hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) - - # 肌色の範囲を指定 lower_skin = np.array([0, 20, 70]) upper_skin = np.array([20, 255, 255]) - # inRangeで作成されるこの画像が、対象が白(255)で背景が黒(0)の「2値画像(白黒画像)」です + # 2値画像(白黒画像)を作成 mask_img = cv2.inRange(hsv_img, lower_skin, upper_skin) - # --- 膨張・収縮のための構造要素(カーネル)の定義 --- - kernel = np.ones((3, 3), np.uint8) + kernel = np.ones((5, 5), np.uint8) - # --- ① 収縮 3回 → 膨張 3回(オープニング処理) --- - # 処理の対象を mask_img(白黒画像) に変更 + # オープニング処理 (収縮 -> 膨張) [Erode to Dilate] eroded_first = cv2.erode(mask_img, kernel, iterations=3) seq_opening = cv2.dilate(eroded_first, kernel, iterations=3) + cv2.imwrite('3_7_e2d.jpg', seq_opening) - # --- ② 膨張 3回 → 収縮 3回(クロージング処理) --- - # 処理の対象を mask_img(白黒画像) に変更 + # クロージング処理 (膨張 -> 収縮) [Dilate to Erode] dilated_first = cv2.dilate(mask_img, kernel, iterations=3) seq_closing = cv2.erode(dilated_first, kernel, iterations=3) - - # --- 結果の表示 --- - # 白黒のマスク画像がどのように変化するかを確認します - 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() \ No newline at end of file + cv2.imwrite('3_7_d2e.jpg', seq_closing) \ No newline at end of file