2021-12-31視覚認識とデータ分析


ダウンジャケット


  • 斬って捜索して倒れる
    Python IDEです


  • アナコンダを起動


  • 入力conda update conda

  • 入力y

  • 入力conda update --all

  • 入力y

  • 入力python,3.9.7メモリ
    ハロー印刷良好

  • exit()を入力して終了

  • 入力conda create --name meta python=3.9.7仮想環境の構成
    metaというpython 3という名前のオプションをください.9.7の仮想環境の使用
  • yを押して、次のコマンド語の使い方をします.基本環境だとわかる.


  • 入力conda activate metaをmetaに変更
    今は環境が変わって、import cv2はだめです.


  • 入力pip install opencv-python opencvインストール
    次にpythonに入ってimport cv 2を行い、正常であることがわかります.

  • conda env listがインストールされている仮想環境を表示


  • スパイク実装中


  • スタート派斬り


  • [new project]をクリックします.
    デスクトップにpycharmフォルダを作成して配置するパス
    さっき設定した名前metaが正しい場合はcreate



  • EXample 1で作成


  • ctrl+shift+F 10でrunを実行
    ctrl+F 5でも構いません

  • 画像処理の基本例


    イメージ変形


    ジョブ

    #  이미지 반환 함수
    def createImage(h_red):
        dst = cv2.bitwise_and(hsv, hsv, mask=h_red)
        # hsv 이미지와 hsv 이미지를 bitwise_and 연산 할것임, 연산 결과는 dst 변수에 담김
        # bitwise_and 연산의 마스크는 h_red (and 연산 할 부분)
    
        dst = cv2.cvtColor(dst, cv2.COLOR_HSV2BGR)
        # hsv 연산이 끝난 이미지를 BGR 채널 이미지로 변경함
        return dst # 이미지 반환
    
    
    src = cv2.imread("tomato.jpg")  # 이미지 가져옴
    hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)  # 색상 검출을 위해 HSV 채널로 변환
    
    h, s, v = cv2.split(hsv)  # hue값 쓰기 위해 hsv 채널 이미지를 분리함
    
    cv2.namedWindow("Palette")  # Palette 이름의 윈도우(창) 생성
    
    # Palette 윈도우에 Hue 이름의 트랙바 생성, 최소값 0, 최대값 179, lambda x:x 이건 뭐지? -> 아무것도 안하는거
    cv2.createTrackbar("Hue", "Palette", 0, 179, lambda x: x)
    while True:
        # Palette 윈도우의 Hue 트랙바 움직일 때마다 값을 가져옴
        hue_val = cv2.getTrackbarPos("Hue", "Palette")
    
        h_red = cv2.inRange(h, 0, hue_val) # hue_val 사용하여 h_red 마스크 생성
    
        cv2.imshow("Palette", createImage(h_red)) # Palette 윈도우에 createImage 함수 반환 결과(이미지)를 보여줌
    
        if cv2.waitKey(33) & 0xFF == ord('q'): # 33미리세컨드마다 키입력 대기, q입력 받으면 종료
            break
    
    cv2.destroyAllWindows()  # 모든 윈도우 release(메모리 헤제)

    画像演算p 212

  • 除算
  • 最低価格
  • 最小値
  • は最小/最大位置
  • を返す.
  • 割引
  • 割引差
  • 比較(比較条件に適合する戻り255)
  • 線形方程式ソルバ
  • 要素ごとのビット演算
    bitは8桁です.1は000001であるため、奇数と無条件and演算子trueを返す.
  • ぼかし効果


  • カーネルとアンカー
    カーネル:特定のピクセルとその周囲の空間を含む小さな空間、信号処理はフィルタとも呼ばれます.
    アンカー:集約値を指定するポイント
    コンテンツ:特定のカーネル(フィルタ)を使用してピクセルを計算し、新しいピクセルを作成します.

  • ブラーまたはスムージング(Blur or Smooth)
    オリジナル画像

    二重フィルタの適用後


  • 短瞬陰dst = cv2.blur(src, ksize, anchor = None, borderType = None)

  • ちゅうかんかdst = cv2.medianBlur(src, ksize)

  • カンウ西安dst = cv2.GaussianBlur(src, ksize, sigmaX, sigmaY = None, borderType = None)
  • import cv2
    
    src = cv2.imread("crescent.jpg")
    
    dst = cv2.GaussianBlur(src, (7,7), 0, 0, borderType = None)
    
    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    オリジナル画像

  • にほうこうフィルタdst = cv2.bilateralFilter(src, d, sigmaColor, sigmaSpace, dst = None, BorderType = None)

  • 鋭く...sharpening
  • src = cv2.imread("Car.png")
    cv2.imshow('src', src)
    sharpening_mask = np.array([[0,-1,0], [-1,5,-1],[0,-1,0]])
    dst = cv2.filter2D(src, -1, sharpening_mask)
    cv2.imshow("dst", dst)
    
    cv2.waitKey(0)
    cv2.destroyAllWindows()


    画像変換


    拡大・縮小

  • 画像ピラミッド
    画像拡大/縮小(アップ/ダウンサンプリング)
  • src = cv2.imread("ferris-wheel.jpg")
    dst = src.copy()
    
    for i in range(3):
        dst = cv2.pyrDown(dst)
        #피라미드는 무조건 2배 규칙이 있어서 여러번 호출 해야 한다.
    
    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    cv2.destoyAllWindows()

    画像サイズの変更

  • resizedst = cv2.resize(src, dsize, fx = None, fy = None, interpolation = None)dsizeは(x,y)フォーマットです.
  • src = cv2.imread("car.png")
    
    dst = src[280:310, 240:405]
    dst = cv2.resize(dst, dsize=(256,256), interpolation = cv2.INTER_NEAREST)
    
    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    画像変換の実践

    import cv2
    #  이미지 반환 함수
    import numpy as np
    
    
    def createImage(h_red):
        dst = cv2.bitwise_and(hsv, hsv, mask=h_red)
        # hsv 이미지와 hsv 이미지를 bitwise_and 연산 할것임, 연산 결과는 dst 변수에 담김
        # bitwise_and 연산의 마스크는 h_red (and 연산 할 부분)
    
        dst = cv2.cvtColor(dst, cv2.COLOR_HSV2BGR)
        # hsv 연산이 끝난 이미지를 BGR 채널 이미지로 변경함
        return dst # 이미지 반환
    
    # 컬러 이미지
    src = cv2.imread("tomato.jpg")  # 이미지 가져옴
    hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)  # 색상 검출을 위해 HSV 채널로 변환
    # print('hsv: ',hsv.shape)
    # 그레이 이미지
    gray_src = cv2.imread("tomato.jpg",0)
    # print('gray_src: ',gray_src.shape)
    
    h, s, v = cv2.split(hsv)  # hue값 쓰기 위해 hsv 채널 이미지를 분리함
    x, y = 0,0
    
    cv2.namedWindow("Palette")  # Palette 이름의 윈도우(창) 생성
    
    # Palette 윈도우에 Hue 이름의 트랙바 생성, 최소값 0, 최대값 179, lambda x:x 이건 뭐지? -> 아무것도 안하는거
    cv2.createTrackbar("Hue", "Palette", 0, 179, lambda x: x)
    while True:
        # Palette 윈도우의 Hue 트랙바 움직일 때마다 값을 가져옴
        hue_val = cv2.getTrackbarPos("Hue", "Palette")
        val_Val = round(cv2.getTrackbarPos("Hue", "Palette") / 358)
    
        # val_Val = 179 - cv2.getTrackbarPos("Hue", "Palette")
    #
    #     _, binary = cv2.threshold(gray_src, val_Val, 255, cv2.THRESH_BINARY) #OTSU
    
        h_red = cv2.inRange(h, 0, hue_val)  # hue_val 사용하여 h_red 마스크 생성
        # print('h_red: ', h_red.shape)
        CCC = (createImage(h_red))
        # print('CCC: ', CCC.shape)
        gray_src = h_red
        binary = cv2.adaptiveThreshold(gray_src, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 33, val_Val)
        # print('binary: ', binary.shape)
        gray = cv2.cvtColor(binary, cv2.COLOR_GRAY2BGR)
        # print('gray: ',gray.shape)
    
        # CCC = (createImage(h_red))
        c = np.vstack((CCC, gray))
        cv2.imshow("Palette", c) # Palette 윈도우에 createImage 함수 반환 결과(이미지)를 보여줌
    
        cv2.moveWindow("Palette", x, y)
        key = cv2.waitKey(33) # 키보드 입력을 무한 대기, 8비트 마스크 처리
        if key == ord('a'):         # 'a' 키이면 좌로 이동
            x -= 100
        elif key == ord('s'):       # 's' 키이면 아래로 이동
            y += 100
        elif key == ord('w'):       # 'w' 키이면 위로 이동
            y -= 100
        elif key == ord('d'):       # 'd' 키이면 우로 이동
            x += 100
        elif key == ord('q') or key == 27: # 'q' 또는 'esc'이면 종료
            break
        cv2.moveWindow("Palette", x, y) # 새로운 좌표로 이동
    
        if cv2.waitKey(33) & 0xFF == ord('q'): # 33미리세컨드마다 키입력 대기, q입력 받으면 종료
            break
        elif cv2.waitKey(33) & 0xFF == 27: # 33미리세컨드마다 키입력 대기, ESC입력 받으면 종료
            break
    
    
    cv2.destroyAllWindows()  # 모든 윈도우 release(메모리 헤제)
    강사님 코드
    import cv2
    import numpy as np
    
    
    def createImage(lower_mask, upper_mask, threshold):
        complete_mask = cv2.addWeighted(lower_mask, 1.0, upper_mask, 1.0, 0.0)
        dst = cv2.bitwise_and(hsv, hsv, mask=complete_mask)
        dst = cv2.cvtColor(dst, cv2.COLOR_HSV2BGR)
    
        gray = cv2.cvtColor(dst, cv2.COLOR_BGR2GRAY)
        _, binary = cv2.threshold(gray, threshold, 255, cv2.THRESH_BINARY)
        binary = cv2.cvtColor(binary, cv2.COLOR_GRAY2BGR)
        dst = np.vstack((dst, binary))
    
        return dst
    
    
    src = cv2.imread("tomato.jpg")
    hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
    
    h, s, v = cv2.split(hsv)
    window_x, window_y = 0, 0
    
    cv2.namedWindow("Palette", flags=cv2.WINDOW_NORMAL)
    cv2.createTrackbar("lower_mask_min_value", "Palette", 0, 179, lambda x: x)
    cv2.createTrackbar("lower_mask_max_value", "Palette", 5, 179, lambda x: x)
    cv2.createTrackbar("upper_mask_min_value", "Palette", 170, 179, lambda x: x)
    cv2.createTrackbar("upper_mask_max_value", "Palette", 179, 179, lambda x: x)
    
    cv2.createTrackbar("threshold", "Palette", 127, 255, lambda x: x)
    
    while True:
        lower_mask_min_value = cv2.getTrackbarPos("lower_mask_min_value", "Palette")
        lower_mask_max_value = cv2.getTrackbarPos("lower_mask_max_value", "Palette")
    
        upper_mask_min_value = cv2.getTrackbarPos("upper_mask_min_value", "Palette")
        upper_mask_max_value = cv2.getTrackbarPos("upper_mask_max_value", "Palette")
    
        threshold = cv2.getTrackbarPos("threshold", "Palette")
    
        lower_mask = cv2.inRange(h, lower_mask_min_value, lower_mask_max_value)
        upper_mask = cv2.inRange(h, upper_mask_min_value, upper_mask_max_value)
    
        cv2.imshow("Palette", createImage(lower_mask, upper_mask, threshold))
    
        key = cv2.waitKey(33)
    
        if key == ord('a'):
            window_x -= 10
        elif key == ord('s'):
            window_y += 10
        elif key == ord('w'):
            window_y -= 10
        elif key == ord('d'):
            window_x += 10
        elif key == ord('q') or key == 27:  # 'q' 이거나 'esc' 이면 종료
            break
            cv2.destroyAllWindows()
        cv2.moveWindow("Palette", window_x, window_y)  # 안배움
    
    cv2.destroyAllWindows()
    
    

    対称&回転

    import math
    import cv2
    
    src = cv2.imread("glass.jpg")
    
    height, width, _ = src.shape
    center = (width / 2, height / 2)
    angle = 90
    scale = 0.5 # 이미지 회전 후 비율 조정
    matrix = cv2.getRotationMatrix2D(center, angle, scale)
    
    radians = math.radians(angle)
    sin = math.sin(radians)
    cos = math.cos(radians)
    bound_w = int((height * scale * abs(sin)) + (width * scale * abs(cos)))
    bound_h = int((height * scale * abs(cos)) + (width * scale * abs(sin)))
    
    matrix[0, 2] += ((bound_w / 2) - center[0])
    matrix[1, 2] += ((bound_h / 2) - center[1])
    
    dst = cv2.warpAffine(src, matrix, (bound_w, bound_h))
    
    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    ジオメトリ変換


    拡大、縮小、位置変更、回転、ねじれなど、形状を人為的に変換します.
  • アフィン変換
    dst = cv2.warpAffine(src, M, dsize, dst = None, flags....)
    入力画像、アフィンマップマトリクス、出力画像サイズ、出力画像、補間、外挿、枠色
  • パース変換
  • import numpy as np
    import cv2
    
    src = cv2.imread("clouds.jpg")
    
    cv2.namedWindow('dst', flags = cv2.WINDOW_NORMAL)
    height, width, _ = src.shape # height, width = src.shape[:2]
    
    pts1 = np.float32([[0,0], [0, height], [width,0], [width,height]])
    pts2 = np.float32([[300,300], [0, height-200], [800,200], [width-100,height-100]])
    
    matrix = cv2.getPerspectiveTransform(pts1, pts2)
    
    dst = cv2.warpPerspective(src, matrix, (width, height))
    
    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    import numpy as np
    import cv2
    
    src = cv2.imread("clouds.jpg")
    
    cv2.namedWindow('dst', flags = cv2.WINDOW_NORMAL)
    height, width, _ = src.shape # height, width = src.shape[:2]
    
    cv2.namedWindow('dst', flags = cv2.WINDOW_NORMAL)
    cv2.namedWindow('src', flags = cv2.WINDOW_NORMAL)
    
    cv2.circle(src, (0,0), 10, (255,0,0), 10) # B
    cv2.circle(src, (0,height), 10, (0,255,0), 10) # G
    cv2.circle(src, (width,0), 10, (0,0,255), 10) # R
    cv2.circle(src, (width,height), 10, (0,255,255), 10) # Y
    
    cv2.imshow('src', src)
    
    pts1 = np.float32([[0,0], [0, height], [width,0], [width,height]])
    pts2 = np.float32([[300,300], [0, height-200], [800,200], [width-100,height-100]])
    
    matrix = cv2.getPerspectiveTransform(pts1, pts2)
    
    dst = cv2.warpPerspective(src, matrix, (width, height))
    
    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

    親トポロジ変換


    コンストラクション要素作成関数は、カーネルのシェイプ(shape)を設定し、長方形のクロスフォーク楕円形でコンストラクション要素を作成します.
  • 膨張
  • 侵食
  • import cv2
    
    src = cv2.imread("dandelion.jpg", cv2.IMREAD_GRAYSCALE)
    
    kernel = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5,5), anchor=(-1,-1))
    # 타원, 사이즈, 고정점
    dst = cv2.erode(src, kernel, iterations=1) #침식 반복 횟수
    
    cv2.imshow("dst", dst)
    cv2.waitKey(0)
    cv2.destroyAllWindows()