반응형
행렬을 표현하는 클래스, 2차원 행렬 및 고차원 행렬까지 표현 할 수 있다.
정수, 실수, 복소수 등으로 구성된 행렬 또는 벡터를 저장하거나 그레이 스케일과 컬러 영상도 저장할 수 있다.
2차원 영상 데이터를 저장하고 처리하는 용도로 가장 많이 쓰이고 있음.

 

멤버 변수

  • Mat::dims : 행렬의 차원
  • Mat::cols : 열 개수 (가로 픽셀 크기)
  • Mat::rows : 행 개수 (세로 픽셀 크기)
  • Mat::size : 3차원 이상 행렬의 크기 정보
  • Mat::data : 행렬의 원소 데이터가 저장된 메모리 공간을 가리키는 포인터형 멤버 변수

 

자료형 매크로 상수

  • CV_8U : uchar, usigned char
  • CV_8S : schar, signed char
  • CV_16U : ushort, unsigned short
  • CV_16S : signed short
  • CV_32S : int
  • CV_32F : float
  • CV_64F : double
  • CV_16F : float16_t

행렬 생성과 초기화

Mat::Mat(int rows, int cols, int type);   // 정의

Mat img2 (480, 640, CV_8UC1); // unsigned char, 1-channel
Mat img3 (480, 640, CV_8UC3); // unsigned char, 3-channels
  • rows : 새로 만들 행렬의 행 개수 (영상의 세로 크기)
  • cols  : 새로 만들 행렬의 열 개수 (영상의 가로 크기)
  • type  : 새로 만들 행렬의 타입
Mat::Mat(Size size, int type);

Mat img4(Size(640,480), CV_8UC3);   // Size(width, height)
  • size : 새로 만들 행렬의 크기, Size(cols, rows) or Size(width, height)
  • type : 새로 만들 행렬의 타입
Mat::Mat(int rows, int cols, int type, const Scalar& s);
Mat::Mat(Size size, int type, const Scalar& s);

Mat img5(480, 640, CV_8UC1, Scalar(128));		// initial values, 128
Mat img6(480, 640, CV_8UC3, Scalar(0, 0, 255));		// initial values, red
  • rows : 새로 만들 행렬의 행 개수 (영상의 세로 크기)
  • cols  : 새로 만들 행렬의 열 개수 (영상의 가로 크기)
  • size  : 새로 만들 행렬의 크기
  • type  : 새로 만들 행렬의 타입
  • s       : 행렬 원소 초기값 
/* 반환값 : 모든 원소가 0으로 초기화 된 행렬 표현식 */

static MatExpr Mat::zeros(int rows, int cols, int type);
static MatExpr Mat::zeros(Size size, int type);

Mat mat1 = Mat::zeros(3, 3, CV_32SC1);		// 0's matrix

/* 반환값 : 모든 원소가 1으로 초기화 된 행렬 표현식 */

static MatExpr Mat::ones(int rows, int cols, int type);
static MatExpr Mat::ones(Size size, int type);

Mat mat1 = Mat::ones(3, 3, CV_32FC1);		// 1's matrix

/* 반환값 : 단위 행렬을 표현하는 표현식 */

static MatExpr Mat::eye(int rows, int cols, int type);
static MatExpr Mat::eye(Size size, int type);

Mat mat1 = Mat::eye(3, 3, CV_32FC1);		// identity matrix

 

외부 메모리 공간의 주소를 지정하는 클래스 

Mat::Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
Mat::Mat(Size size, int type, 


float data[] = { 1, 2, 3, 4, 5, 6 };

Mat mat4(2, 3, CV_32FC1, data);
Mat mat5 = (Mat_<float>(2, 3) << 1, 2, 3, 4, 5, 6);
Mat mat6 = Mat_<uchar>({2, 3}, { 1, 2, 3, 4, 5, 6 });

$$ mat4 = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix} $$

$$ mat5 = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix} $$

$$ mat6 = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{pmatrix} $$

 

행렬 생성 및 초기화 클래스

void Mat::create(int rows, int cols, int type);
void Mat::create(Size size, int type);

mat4.create(256, 256, CV_8UC3);	// uchar, 3-channels
mat5.create(4, 4, CV_32FC1);	// float, 1-channel
Mat& Mat::operator = (const Scalar& s);
// s : 행렬 원소에 설정할 값
// RETURN : 값이 설정된 Mat 객체 참조

Mat& Mat::setTo(InputArray value, InputArray mask = no array());
// Value  : 행렬 원소에 설정할 값
// mask   : 마스크 행렬의 원소가 0이 안인 위치에서만 value 값이 설정됨.
// RETURN : Mat 객체의 참조

mat4 = Scalar(255, 0, 0);
mat5.setTo(1.f);

 

반응형
반응형

Point Class

  • 2차원 평면에 있는 점의 좌표를 표현하는 클래스
  • 2차원 좌표를 나타내는 x와 y라는 멤버 변수를 가진다
Point pt;  // 각 좌표는 0으로 초기화
pt.x = 10; // x 좌표 설정
pt.y = 20; // y 좌표 설정
Point pt1(20,40); // x,y 좌표 설정

Size Class

  • 사각형 영역 및 영상 (이미지)의 크기를 표현할 때 사용한다
  • 멤버변수 : width (가로), height (세로)
Size sz, sz2(10, 20); // sz1 = [0 x 0] , sz2 = [10 x 20]
sz1.width = 5;  
sz2.height = 10; // sz1 = [5 x 10]

Rect_ Class

  • 사각형의 위치와 크기 정보를 표현할 때 사용
  • 좌측 상단 점을 x,y로 표현, 가로 세로의 크기를 width와 height 멤버 변수로 나타낸다.
Rect rc1;
Rect rc2(10, 10, 60, 40); // rc2 좌측 상단점 (10,10)을 시작으로 60 x 40 사이즈의 사각형을 나타냄.

RotatedRect Class

  • 회전한 사각형을 표현하는 클래스
  • 사각형의 중심 좌표를 나타내는 Center, 사각형의 가로 및 세로 크기를 나타내는 size
    회전 각도 정보는 angle 멤버 변수로 나타낸다.
RotatedRect rr1(Point2f(40, 30), Size2f(40, 20), 30.f);
// rr1 중심좌표는 (40, 30)
// 사각형의 크기는 40 x 20
// 회전 각도는 30º

Range Class

  • 범위 또는 구간을 표현하는 클래스
  • 시작과 끝을 start와 end 멤버변수로 나타낸다
Range r1(0, 10); // r1은 0 ~ 9 까지 범위를 표현한다

 

String Class

  • 문자열을 저장하고 처리하는 클래스
String str1 = "Hello!";
String str2 = "World";
반응형

'스터디 > Computer Vision' 카테고리의 다른 글

OpenCV :: Mat Class (1)  (0) 2023.01.10
영상의 밝기 조절 과 산술 연산  (0) 2023.01.05
히스토그램 (Histogram)  (2) 2022.12.28
OpenCV 기초 - 영상 속성과 픽셀 값 처리  (0) 2022.12.19
반응형

영상의 화소 처리 기법

화소 처리 (Point processing)

  • 입력 영상의 특정 좌표 픽셀 값을 변경하여 출력 영상의 해당 좌표 픽셀 값으로 설정하는 연산

\( dst(x,y) \ = \ f(src(x,y)) \quad f \) : 변환함수

  • 결과 영상의 픽셀 값이 정해진 범위 (e.g. 그레이 스케일)에 있어야 한다
  • 반전, 밝기 조절, 명암비 조절 등등

영상의 밝기 조절

 

밝기 조절 수식

\( dst(x,y) \ = \ saturate(src(x,y) + n) \)

 

 

밝기 조절을 위한 덧셈 연산 (함수)

cv2.add(src1, src2, dst=None, mask=None, dtype=None)
  • src1:            (입력) 첫 번째 영상 또는 스칼라
  • src2:            (입력) 두 번째 영상 또는 스칼라
  • dst:              (출력) 덧셈 연산의 결과 영상
  • mask:          마스크 영상
  • dtype:         출력 영상(dst)의 타입. (e.g.) cv2.CV_8U, cv2.CV_32F 등
  • 참고사항
    • 스칼라(Scalar)는 실수 값 하나 또는 실수 값 네 개로 구성된 튜플
    • dst를 함수 인자로 전달하려면 dst의 크기가 src1, src2와 같아야 하며, 타입이 적절해야 함

Grayscale , 밝기 100 증가 예제 코드

src = cv2. imread('lenna.bmp', cv2.IMREAD_GRAYSCALE)

dst1 = cv2.add(src, 100)

dst2 = src + 100

Color 영상 , 밝기 100 증가 예제 코드

src = cv2.imread('lenna.bmp')

dst1 = cv2.add(src, (100, 100, 100, 0))

dst2 = np.clip(src + 100., 0, 255).astype(np.uint8)

 


영상의 산술 연산

 

영상의 산술 연산

덧셈 연산

\( dst(x,y) = saturate(src1(x,y) + src2(x,y)) \)

  • 두 영상의 같은 위치에 존재하는 픽셀 값을 더하여 결과 영상의 픽셀 값으로 설정한다.
  • 덧셈 결과가 255보다 크다면 픽셀 값을 255로 설정 (포화 연산) 

 

cv2.add(src1, src2, dst=None, mask=None, dtype=None)

 함수 인자 정보는 위 서술한 세부내용 확인

 

가중치 합 (weighted sum)

\(  dst(x,y) = saturate(\alpha * src1(x,y) \ + \ \beta * src2(x,y)) \)

  • 두 영상의 같은 위치에 존재하는 픽셀 값에 대하여 가중합을 계산하여 결과 영상의 픽셀 값으로 설정
  • 보통 \(\alpha \ + \ \beta = 1\) 이 되도록 설정 ☞ 두 입력 영상의 평균 밝기를 유지한다.

cv2.addWeighted(src1, alpha, src2, beta, gamma, dst=None, dtype=None)
  • src1:        첫 번째 영상
  • alpha:      첫 번째 영상 가중치
  • src2:        두 번째 영상. src1과 같은 크기 & 같은 타입
  • beta:        두 번째 영상 가중치
  • gamma:   결과 영상에 추가적으로 더할 값
  • dst:          가중치 합 결과 영상
  • dtype:      출력 영상(dst)의 타입

 

평균 연산 (average)

  • 가중치를  \(\alpha \ = \ \beta \ = \ 0.5 \) 로 설정한 가중치 합

\( dst(x,y) = \frac{1}{2}(src1(x,y) + src2(x,y)) \)

 

 

뺄셈 연산

\( dst(x,y) = saturate(src1(x,y) - src2(x,y)) \)

  • 두 영상의 같은 위치에 존재하는 픽셀 값에 대하여 뺄셈 연산을 수행하여 결과 영상의 픽셀 값으로 설정
  • 뺄셈 결과가 0보다 작으면 픽셀 값을 0으로 설정 (포화 연산)
cv2.subtract(src1, src2, dst=None, mask=None, dtype=None)

src1:    첫 번째 영상 또는 스칼라 

src2:    두 번째 영상 또는 스칼라

dst:      뺄셈 연산 결과 영상

mask:  마스크 영상

dtype:  출력 영상(dst)의 타입

 

차이 연산

\( dst(x,y) = |src1(x, y) src2(x, y)| \)

  • 두 영상의 같은 위치에 존재하는 픽셀 값에 대하여 뺄셈 연산을 수행한 후, 그 절댓값을 결과 영상의 픽셀 값으로 설정
  • 뺄셈 연산과 달리 입력 영상의 순서에 영향을 받지 않음
cv2.absdiff(src1, src2, dst=None)
  • src1:     첫 번째 영상 또는 스칼라
  • src2:     두 번째 영상 또는 스칼라
  • dst:       차이 연산 결과 영상 (차영상)

 

영상 산술연산

 

 

반응형

'스터디 > Computer Vision' 카테고리의 다른 글

OpenCV :: Mat Class (1)  (0) 2023.01.10
OpenCV :: 기본 자료형 클래스  (0) 2023.01.09
히스토그램 (Histogram)  (2) 2022.12.28
OpenCV 기초 - 영상 속성과 픽셀 값 처리  (0) 2022.12.19
반응형

▶ OpenCV Python 관련 글은 황선규 박사님의 강의내용을 정리하였음.

Histogram

  • 영상의 픽셀 값 분포를 그래프의 형태로 표현한 것
  • 그레이 스케일 영상에서 각 그레이 스케일 값에 해당하는 픽셀의 수를 구하고, 막대 그래프 형태로 표현한다.

$$ h(g) = N_g $$

 


Normalized histogram

  • 각 픽셀의 수를 영상 전체 픽셀 개수로 나눠준 것
  • 그레이 스케일 값을 갖는 픽셀이 나타날 확률

\( p(g) = \frac{N_g}{w\times h} \)         \(\displaystyle \sum _{g=0} ^{L-1} {p(g) = 1}\)


히스토그램 구하기

cv2.calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None)
  • images: 입력 영상 리스트
  • channels: 히스토그램을 구할 채널을 나타내는 리스트
  • mask: 마스크 영상. 입력 영상 전체에서 히스토그램을 구하려면 None 지정.
  • histSize: 히스토그램 각 차원의 크기(빈(bin)의 개수)를 나타내는 리스트
  • anges: 히스토그램 각 차원의 최솟값과 최댓값으로 구성된 리스트
  • hist: 계산된 히스토그램 (numpy.ndarray)
  • accumulate: 기존의 hist 히스토그램에 누적하려면 True, 새로 만들려면 False.

그레이스케일 영상의 히스토그램 구하기

src = cv2.imread('lenna.bmp', cv2.IMREAD_GRAYSCALE)

hist = cv2.calcHist([src], [0], None, [256], [0, 256])

plt.plot(hist)
plt.show()

출력 결과 값

 

컬러 영상의 히스토그램 구하기

src = cv2.imread('lenna.bmp')

colors = ['b', 'g', 'r']
bgr_planes = cv2.split(src)

for (p, c) in zip(bgr_planes, colors):
    hist = cv2.calcHist([p], [0], None, [256], [0, 256])
    plt.plot(hist, color=c)

plt.show()

출력 결과 값

 

OpenCV 그리기 함수로 그레이스케일 영상 히스토그램 구하기

def getGrayHistImage(hist):
	imgHist = np.full((100, 256), 255, dtype=np.uint8)
    
	histMax = np.max(hist)
	for x in range(256):
        pt1 = (x, 100)
        pt2 = (x, 100 - int(hist[x, 0] * 100 / histMax))
        cv2.line(imgHist, pt1, pt2, 0)
        
	return imgHist
    
src = cv2.imread('lenna.bmp', cv2.IMREAD_GRAYSCALE)

hist = cv2.calcHist([src], [0], None, [256], [0, 256])

histImg = getGrayHistImage(hist)

출력 결과 값

 

반응형
반응형

▶ OpenCV Python 관련 글은 황선규 박사님의 강의내용을 정리하였음.

Github 소스

영상의 속성과 픽셀 값 참조

  • OpenCV는 영상 데이터를 numpy.ndarray로 표현한다.
import cv2

img1 = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)

numpy.ndarray

  • ndim : 차원 수, len(img.shape)과 같음.
  • shape : 각 차원의 크기 (h, w) Gray scale or (h, w, 3) Color  
                 → (h,w,n) : n 값이 2이면 graysclae , 3이면 color 라고 생각해도 문제 없다.
  • size : 전체 원소 개수
  • dtype : 원소의 데이터 타입. 영상 데이터는 unit8

OpenCV 영상 데이터 자료형과 Numpy 자료형

OpenCV 자료형 Numpy 자료형 구분
cv2.CV_8U numpy.uint8 8비트 부호없는 정수
cv2.CV_8S numpy.int8 8비트 부호있는 정수
cv2.CV_16U numpy.uint16 16비트 부호없는 정수
cv2.CV_16S numpy.int816 16비트 부호있는 정수
cv2.CV_32S numpy.int32 32비트 부호있는 정수
cv2.CV_32F numpy.float32 32비트 부동소수형
cv2.CV_64F numpy.float64 64비트 부동소수형
cv2.CV_16F numpy.float16 16비트 부동소수형
  • 그레이스케일 영상 : cv2.CV_8UC1 → numpy.uint8, shape = (h, w)
  • 컬러 영상 : cv2.CV_8UC3 → numpy.uint8, shape = (h, w, 3)

영상의 속성 참조 예제 코드

img1 = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)

print('type(img1):', type(img1)) # type(img1): <class 'numpy.ndarray'>
print('img1.shape:', img1.shape) # img1.shape: (480, 640)
print('img2.shape:', img2.shape) # img2.shape: (480, 640, 3)
print('img2.dtype:', img2.dtype) # img2.dtype: uint8

h, w = img2.shape[:2] # h: 480, w: 640
print('img2 size: {} x {}'.format(w, h))

if len(img1.shape) == 2:
	print('img1 is a grayscale image')
elif len(img1.shape) == 3:
	print('img1 is a truecolor image')
img1 = cv2.imread('cat.bmp', cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread('cat.bmp', cv2.IMREAD_COLOR)

for y in range(h):
	for x in range(w):
		img1[y, x] = 255
		img2[y, x] = [0, 0, 255]   #for문은 절대 사용 금지
        
        
# img1[:,:] = 255
# img2[:,:] = (0, 0, 255)

 

반응형

'스터디 > Computer Vision' 카테고리의 다른 글

OpenCV :: Mat Class (1)  (0) 2023.01.10
OpenCV :: 기본 자료형 클래스  (0) 2023.01.09
영상의 밝기 조절 과 산술 연산  (0) 2023.01.05
히스토그램 (Histogram)  (2) 2022.12.28

+ Recent posts