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
# 이미지 반환 함수
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(메모리 헤제)
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()
画像サイズの変更
dst = 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()
Reference
この問題について(2021-12-31視覚認識とデータ分析), 我々は、より多くの情報をここで見つけました https://velog.io/@ansunny1170/2021-12-31-vision-인식-Data분석テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol