OpenCV 이미지 픽셀

최고고·2022년 5월 18일
0

이미지 처리 방법

  • 1) 픽셀 기반 처리
  • 2) 블록 기반 처리
    • 블록 : 픽셀을 그룹화 한 것
  • 3) 주파수 기반 처리
    • 이미지에서의 주파수 : 이미지 픽셀값의 변화
    • 고주파 : 픽셀값의 변화가 큼
    • 저주파 : 픽셀값의 변화가 작음

이미지 픽셀값 출력

import cv2
img = cv2.imread('ty2.png')
px = img[200,100] ---- 픽셀좌표 200,100 위치한 픽셀값
print(px) ---- BGR 순으로 출력됨

픽셀값 변경

  • BGR 값 한번에 변경
    img = cv2.imread('ty2.png')
    img[200,100] = [0,0,0]
    cv2.imshow('ty2.png',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

B값만 변경

img = cv2.imread('ty2.png')
img[200,100,0] = 255 -- 0번째 인덱스(B)
cv2.imshow('ty2.png',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
print(img.shape)
print(img.size) # shape 3가지 곱한 값
print(img.dtype) #데이터타입 -> uint: 음수없는타입

  • uint8:0~255
  • int8:-128~127

블록기반처리 ROI (Region of Image)

  • BGR 값 한번에 변경
    img = cv2.imread('ty2.png')
    #좌상단()
    #우하단()
    #좌:우 앞, 좌:우 뒤
    subimg = img[35:300,150:350]
    cv2.imshow('ty_face',subimg)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

도형 그리기

  • cv2.circle : 원

  • cv2.rectangle : 사각형

  • cv2.elipse : 타원

  • cv2.line : 선

  • 사용방법 매개변수4개( 배경이미지, 좌표, 색상, 선의 두께)

  • cv2.putText(배경이미지, 출력내용, 출력시작좌표, 폰트, 크기, 색상, 굵기)

img = cv2.rectangle(img, (180,35),(350,300),(0,0,255),3)
font = cv2.FONT_HERSHEY_SIMPLEX
img = cv2.putText(img,'TY is LOVE',(180,35),font, 1, (255,0,0),4)
#좌상단()
#우하단()
#좌:우 앞, 좌:우 뒤
subimg = img[35:300,180:350]
cv2.imshow('ty_face',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

한글출력

from PIL import ImageFont, ImageDraw, Image
import numpy as np
img = cv2.imread('ty2.png')
img = cv2.rectangle(img, (180,35),(350,300),(0,0,255),3)

  • 폰트, 폰트크기 결정
    font = ImageFont.truetype("fonts/gulim.ttc", 30)
  • 이미지변환
    img_pil = Image.fromarray(img)
    draw = ImageDraw.Draw(img_pil)
  • 한글출력
    좌표값,내용, 폰트,색상
    draw.text((180,10),'탱구탱구탱구탱구탱구', font = font, fill = (255,0,0,0))
  • 이미지 원상 복귀
    img = np.array(img_pil)
    cv2.imshow('ty_face',img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

이미지 영역 값 변경

import cv2
import numpy as np
img = cv2.imread('ty2.png')
mask = cv2.imread('tiger.png')

mask 이미지를 붙일 위치의 배경이미지 잘라내기

rows, cols, channels = mask.shape #shape 차례로 세개 변수에담음
#원하는 영역 이미지 roi
#세로, 가로
roi = img[140:140+rows,200:200+cols]

#마스크 이미지 만들기
mask2gray = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
ret,mask_b = cv2.threshold(mask2gray,200,255, cv2.THRESH_BINARY)

마스크 이미지 반전 - 흑백 전환 0->255, 255->0 변환

mask_b_inv = cv2.bitwise_not(mask_b)

#호랑이 이미지에서 마스크부분만(배경제외 부분) 추출함 ,, 누끼
img_bg = cv2.bitwise_and(roi,roi, mask= mask_b)
img_fg = cv2.bitwise_and(mask,mask, mask= mask_b_inv)
같은건두고, 다른건 지움, mask = 부분은 걍 지워라

#ROI 이미지에 마스크 이미지 합치기
bg_fg = cv2.add(img_bg, img_fg)

#배경이미지 해당위치에 합한 이미지 붙히기
img[140:140+rows,200:200+cols] = bg_fg

1 : 배경(원본) 2: 붙혀놓을 이미지 3: 붙혀넣을 영역
cv2.imshow('1', img)
cv2.imshow('2', mask)
cv2.imshow('3', roi)
cv2.imshow('4', mask2gray)
cv2.imshow('5', mask_b)
cv2.imshow('6', mask_b_inv)
cv2.imshow('7', img_bg)
cv2.imshow('8', img_fg)
cv2.imshow('9', bg_fg)
cv2.imshow('10', img)
cv2.waitKey(0)
cv2.destroyAllWindows()


색상 추적하기

  • HSV
  • 색상(H),채도(S),명도(B)
  • 채도 : 색상의 선명한 정도, 채도가 낮으면 탁하다, 채도가 높을수록 선명
  • 명도 : 색의 밝은 정도, 명도가 가장 높으면 흰색, 가장낮으면 검은색

import cv2
import numpy as np
img = cv2.imread('balloon.jfif')
cv2.imshow('original',img)

hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)

#주황색
lower = np.array([-20,100,100])
upper = np.array([20,255,255])

#노란색
lower = np.array([20,100,100])
upper = np.array([50,255,255])
#초록색
lower = np.array([50,100,100])
upper = np.array([80,255,255])

#hsv 안에서 lower~ upper 사이에 값이 아니면 전부다 0으로 채움
mask = cv2.inRange(hsv, lower, upper)
img2 = cv2.bitwise_and(img,img, mask=mask)

cv2.imshow('red',img2)
cv2.imshow('red',img2)
cv2.imshow('red',img2)

cv2.waitKey(0)
cv2.destroyAllWindows()

0개의 댓글