이미지 연산

    728x90
    반응형
    # 이미지 덧셈
    cv2.add(image, 100)
    # 일괄적으로 모든 픽셀에 100을 더하기
    # 결과가 255보다 크면 255로, 255가 넘으면 255로 맞춰줌
    
    # 두 개의 이미지 더하기
    img1 = cv2.imread('chair.webp')
    img2 = cv2.imread('explosion.webp')
    cv2.add(chair, explosion)
    show(cv2.add(img1, img2))
    
    # 가중치를 곱하여 더하기(2:8로 더하고 일괄적으로 10 더함)
    cv2.addWeighted(chair, 0.2, explosion, 0.8, 0)
    # 이미지 뺄셈
    # 일괄적으로 모든 픽셀에 100을 빼기
    cv2.subtract(image, 100)
    # 결과가 0보다 작으면 0으로 만듦
    
    show(image + 100)
    
    # 두 개의 이미지 빼기
    black_circle = cv2.imread('black_circle.png')
    show(cv2.subtract(chair, black_circle))
    
    # 두 개의 이미지 차이의 절대값(순서에 영향 X)
    show(cv2.absdiff(chair, explosion))
    
    # 이미지를 뺄 때 순서가 다르면 다른 이미지로 반영됨
    # 이미지 곱셈과 나눗셈
    # 곱셈
    cv2.multiply(image, 1.2)
    # 나눗셈
    cv2.divide(image, 1.2)
    # 색 반전
    255 - image
    show(image + 100)

     

    컬러 스페이스

     

    색을 표현하는 방법

     

    RGB: 빛의 삼원색인 빨강(R), 초록(G), 파랑(B)을 사용

    과거에는 BGR이 널리 쓰이다, 현재는 RGB로 주류가 바뀜

    OpenCV는 BGR이 주로 쓰이던 시절에 개발되어 BGR이 기본

     

    HSV:

    색상(Hue): 빨강, 파랑, 노랑 등

    채도(Saturation): 진하다, 흐리다

    명도(Value): 밝다, 어둡다

     

    Gray: 흑백

     

    ## 컬러 스페이스 바꾸기
    # BGR에서 흑백으로
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    
    # 흑백에서 BGR로(눈에 보이는 색은 바뀌지 않음)
    show(cv2.cvtColor(gray, cv2.COLOR_GRAY2BGR))
    
    # BGR에서 HSV로
    hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
    show(hsv)
    
    # 채널 분리
    # BGR 채널을 분리
    b, g, r = cv2.split(image)
    
    # B 채널만 보기(흑백으로 보임)
    Image.fromarray(b)
    
    # GR 채널을 0으로 채우면 파란색으로 볼 수 있음
    z = np.zeros_like(b)
    show(cv2.merge((b, z, r))) # z로 바꾸면 그 색상을 제외하고 나타내짐
    
    # 특정 색상만 추출
    
    # HSV에서 H가 40~80 사이, SV는 50~255 사이인 부분만 추출
    lower_blue = np.array([40, 50, 50])
    upper_blue = np.array([80, 255, 255])
    mask = cv2.inRange(hsv, lower_blue, upper_blue)
    Image.fromarray(mask)
    
    # 원래 이미지에서 mask 부분만 보기
    show(cv2.bitwise_and(image, image, mask=mask))
    
    # 이미지에 빨간 점 하나 찍기
    dup = image.copy() # 복사
    center = 100, 100 # 중심 좌표
    radius = 10 # 반지름
    color = 0, 0, 255 # 색상
    thickness = -1 # 두께 설정 (-1은 채워진 원을 의미)
    show(cv2.circle(dup, center, radius, color, thickness))

     

    비트와이즈 연산

    # 비트와이즈 연산
    # 비트단위로 논리 연산
    # 마스크를 적용할 경우, 마스크가 흰색인 부분만 통과
    
    # AND: 두 이미지의 비트에 대해 AND(둘 다 1일 때만 1)
    show(cv2.bitwise_and(image, dup))
    
    # OR: 두 이미지의 비트에 대해 OR(둘 중 하나라도 1이면 1)
    show(cv2.bitwise_or(image, dup))
    
    # XOR: 두 이미지의 비트에 대해 XOR(둘 중 하나만 1이어야 1) → 다른 부분 찾기
    show(cv2.bitwise_xor(image, dup))
    728x90
    반응형

    'AI > 딥러닝(DL)' 카테고리의 다른 글

    OpenCV 기초, 이미지 처리, 비디오 처리  (0) 2024.11.11
    컴퓨터 비전 과업(Computer CV, Task)  (0) 2024.11.11

    댓글