9일차 연습문제(OpenCV)

송용진·2024년 3월 3일
  • OpenCV
    • 실습 예제
      • 기본 이미지 처리
        • 이미지 읽기, 표시, 저장
          import cv2
          
          # 이미지 읽기
          img = cv2.imread('input.jpg')
          
          # 이미지 표시
          cv2.imshow('Image',img)
          cv2.waitKey(0)
          cv2.destoryAllWindow()
          
          # 이미지 저장
          cv2.imwrite('output.jpg',img)
        • 이미지 그레이스케일 변환
          import cv2
          
          # 이미지 읽기
          img = cv2.imread('input.jpg')
          
          # 그레이스케일 변환
          gray_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
          
          # 변환된 이미지 표시
          cv2.imshow('Grayscale Image', gray_img)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
        • 이미지 리사이즈
          import cv2
          
          # 이미지 읽기
          img = cv2.imread('input.jpg')
          
          # 이미지 리사이즈
          resized_img = cv2.resize(img,(200,200))
          
          # 리사이즈된 이미지 표시
          cv2.imshow('Resized Image', resized_img)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
      • 고급 이미지 처리
        • 이미지 회전
          import cv2
          
          # 이미지 읽기
          img = cv2.imread('input.jpg')
          
          # 이미지 중심을 기준으로 90도 회전
          height, width = img.shape[:2] #print(img.shape) #(1666, 1930, 3)
          center =(width/2, height/2)
          rotate_matrix = 
          cv2.getRotationMatrix2D(center = center, angle = 90, scale = 1)
          # rotate_matrix는 회전시킬 때 필요한 matrix
          # scale 매개변수는 회전 후 이미지의 크기를 조절
          rotated_img = 
          cv2.warpAffine( src = img, M = rotate_matrix, dsize = (width,height)) 
          # 이미지의 이동, 회전, 크기 조절 및 기타 변환을 수행하는 함수
          
          # 회전된 이미지 표시
          cv2.imshow('회전된 이미지',rotated_img)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
        • 가우시안 블러 적용
          import cv2
          
          # 이미지 읽기
          img = cv2.imread('input.jpg')
          
          # 가우시안 블러 적용
          blurred_img = cv2.GaussianBlur(img, (5,5), 0) # (src,ksize,sigmaX)
          # sigmaX,ksize는 크기가 클수록 블러링의 효과가 강해지고, 
          # 작을수록 블러링의 효과가 약해짐
          # (sigmaY를 생략하면, OpenCV는 자동으로 sigmaX와 동일한 값을 사용)
          
          # 블러된 이미지 표시
          cv2.imshow('블러된 이미지', blurred_img)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
        • 경계 감지
          import cv2
          
          # 이미지 읽기
          img = cv2.imread('input.jpg')
          
          # 그레이스케일 변환
          gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
          
          # Canny edge detection 적용
          edges = cv2.Canny(image = gray_img, threshold1 = 100, threshold2 = 200)
          
          # 경계가 감지된 이미지 표시
          cv2.imshow('경계가 감지된 이미지', edges)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
          
          '''
          Canny 엣지 검출은 
          먼저 전체 이미지에서 엣지 후보를 찾고, 
          그 다음에 낮은 임계값과 높은 임계값을 사용하여 이를 정리합니다. 
          
          Canny 엣지 검출에서 threshold는 
          엣지로 간주될 픽셀의 강도를 결정하는 임계값입니다. 
          
          이것은 두 가지 임계값으로 구성됩니다: 
          1.낮은 임계값 (Low Threshold): 
          이 임계값 이하의 엣지 픽셀은 엣지로 간주되지 않습니다. 
          이것은 약한 엣지를 식별하는 데 사용됩니다. 
          (약한 엣지는 주로 엣지가 될 가능성이 있는 픽셀이지만, 
          이웃 픽셀들과 비교하여 상대적으로 강도가 낮은 픽셀을 의미합니다.)
          2.높은 임계값 (High Threshold): 
          이 임계값 이상의 엣지 픽셀은 강한 엣지로 간주됩니다. 
          이것은 실제 엣지로 간주되기 위해 충족해야하는 엣지 픽셀의 강도를 결정합니다.
          '''
      • 객체 감지
        • 얼굴 인식
          import cv2
          
          # 얼굴 감지를 위한 분류기 로드
          face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
          
          # 이미지 읽기
          img = cv2.imread('input.jpg')
          gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
          
          # 얼굴 감지
          faces = face_cascade.detectMultiScale(gray, 1.1, 4)
          # 1.1은 이미지의 각 스케일에서 
          # 객체 크기를 얼마나 줄일지를 결정하는 스케일 팩터 (기본값은 1.3)
          # 4는 이웃 사각형의 갯수를 나타냄 (기본값은 3)
          # 높을수록 더 높은 신뢰성을 가지지만 처리 속도는 느려짐
          
          # 감지된 얼굴 주위에 사각형 그리기
          for (x, y, w, h) in faces:
              cv2.rectangle(img, (x, y), (x+w, y+h), (255, 0, 0), 2)
          
          # 결과 이미지 표시
          cv2.imshow('감지된 얼굴', img)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
        • 동영상 처리
          import cv2
          
          # 동영상 파일 열기
          cap = cv2.VideoCapture('video.mp4')
          
          # 출력 파일 설정
          fourcc = cv2.VideoWriter_fourcc(*'MP4V')  # 출력 파일의 코덱 설정
          out = cv2.VideoWriter('output_video.mp4', fourcc, 20.0, (640, 480), isColor=False)
          
          while cap.isOpened():
              ret, frame = cap.read()
              if not ret:
                  break
          
              # 프레임을 그레이스케일로 변환
              gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
          
              # 변환된 프레임을 출력 파일에 쓰기
              out.write(gray)
          
              # 변환된 프레임을 화면에 표시
              cv2.imshow('frame', gray)
              if cv2.waitKey(1) == ord('q'):
                  break
          
          # 작업 완료 후 해제
          cap.release()
          out.release()
          cv2.destroyAllWindows()
    • 실습 문제
      • 1.이미지 그레이스케일 변환 주어진 컬러 이미지를 그레이스케일로 변환하세요.
        • 송용진의 코드
          import cv2
          
          img = cv2.imread('input.jpg')
          cv2.imshow("주어진 컬러 이미지",img)
          
          # 그레이스케일로 변환
          grayscale_img = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
          cv2.imshow("그레이스케일로 변환한 이미지",grayscale_img)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
      • 2.이미지 리사이즈 주어진 이미지의 크기를 절반으로 줄이세요.
        • 송용진의 코드
          import cv2
          
          img = cv2.imread('input.jpg')
          cv2.imshow("given image",img)
          
          # 이미지의 크기를 절반으로
          width, height = img.shape[:2]
          res_img = cv2.resize(img,(int(width/2),int(height/2)))
          cv2.imshow("resized_image",res_img)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
      • 3.이미지 회전 주어진 이미지를 90도 회전하세요.
        • 송용진의 코드
          import cv2
          
          img = cv2.imread('input.jpg')
          cv2.imshow('image',img)
          
          # 90도 회전
          width, height = img.shape[:2]
          img_center = (width/2,height/2)
          #회전시킬 때 필요한 행렬 rotate_matrix
          rotate_matrix = cv2.getRotationMatrix2D(center = img_center, angle = 90, scale = 1.0)
          rotated_img = cv2.warpAffine(src = img, M = rotate_matrix, dsize = (width,height))
          cv2.imshow('rotated_img',rotated_img)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
      • 4.가우시안 블러 적용 이미지에 가우시안 블러를 적용하여 노이즈를 줄이세요.
        • 송용진의 코드
          import cv2
          
          img = cv2.imread("input.jpg")
          cv2.imshow('img',img)
          
          # 가우시안 블러를 적용
          Gaussian_img = cv2.GaussianBlur(src = img, ksize=(5,5),sigmaX=0)
          cv2.imshow('Gaussian_img',Gaussian_img)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
      • 5.경계 감지 Canny 알고리즘을 사용하여 이미지의 경계를 감지하세요.
        • 송용진의 코드
          import cv2
          
          img = cv2.imread('input.jpg')
          cv2.imshow('img',img)
          
          # 잘 감지할 수 있도록 그레이스케일로 전처리
          gray_img = cv2.cvtColor(src=img,code=cv2.COLOR_BGR2GRAY)
          cv2.imshow('gray_img',gray_img)
          
          # Canny 알고리즘을 사용하여 이미지의 경계를 감지
          canny_img = cv2.Canny(image=img,threshold1=100,threshold2=200)
          cv2.imshow('canny_img',canny_img)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
      • 6.색상 검출 이미지에서 특정 색상(예: 빨간색)만 검출하세요.
        • 송용진의 코드
          import cv2
          import numpy as np
          
          img = cv2.imread('input2.jpg')
          cv2.imshow('img',img)
          
          # 빨간색만 검출
          hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # BGR에서 HSV로 변환
          
          # 빨간색의 범위 지정
          lower_red = np.array([0, 100, 100])
          upper_red = np.array([1, 255, 255])
          
          # HSV 이미지에서 빨간색에 해당하는 영역을 마스킹
          mask = cv2.inRange(hsv_img, lower_red, upper_red)
          
          # 결과 이미지 생성
          result = cv2.bitwise_and(img, img, mask=mask)
          
          # 결과 출력
          cv2.imshow("result ", result)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
      • 7.얼굴 인식 : 이미지에서 얼굴을 인식하고, 감지된 각 얼굴 주위에 사각형을 그리세요.
        • 송용진의 코드
          import cv2
          
          img = cv2.imread('input.jpg')
          gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
          
          # 얼굴 감지를 위한 분류기 로드
          face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
          
          # 얼굴 감지
          faces = face_cascade.detectMultiScale(gray)
          
          # 감지된 얼굴 주위에 사각형 그리기
          for (x, y, w, h) in faces:
              cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 5)
          
          # 결과 이미지 표시
          cv2.imshow('detected_faces', img)
          cv2.waitKey(0)
          cv2.destroyAllWindows()
profile
개발자

0개의 댓글