반응형

A SPICE 참조 모델

 

SWE (Software Engineering Process Group)

  • SWE.1 소프트웨어 요구사항 분석
  • SWE.2 소프트웨어 아키텍처 설계
  • SWE.3 소프트웨어 상세 설계 및 유닛 개발
  • SWE.4 소프트웨어 유닛 검증
  • SWE.5 소프트웨어 통합 및 통합 시험
  • SWE.6 소프트웨어 인정 시험

SWE.4 소프트웨어 유닛 검증

           구분                                                                  내용
      Process ID SWE.4
    Process name 소프트웨어 유닛 검증
  Process purpose 소프트웨어 유닛 검증 프로세스의 목적은 소프트웨어 유닛이 상세 설계와 비기능적 소프트웨어 요구사항을 준수하고 있다는 증거를 제공하기 위하여 소프트웨어 유닛을 검증하는 것이다.
 Process outcomes 1) 회귀 전략을 포함한 소프트웨어 유닛 검증 전략이 소프트웨어 유닛을 검증하기 위해 개발된다.

2) 소프트웨어 유닛이 소프트웨어 상세 설계와 비기능적 소프트웨어 요구사항을 준수하고 있다는 
    증거를 제공하기에 적합한 소프트웨어 유닛 검증이 소프트웨어 유닛 검증 전략에 따라 개발된다.

3) 소프트웨어 유닛 검증 전략과 소프트웨어 유닛 검증 기준에 따라 소프트웨어 유닛이 검증되고 
    그 결과가 기록된다.

4) 일관성과 양방향 추적성이 소프트웨어 유닛, 검증을 위한 기준, 검증 결과 간에 수립된다.

5) 유닛 검증의 결과가 요약되고 영향받는 모든 당사자에게 의사소통된다.
  SWE.4.BP1: 회귀 전략을 포함한 소프트웨어 유닛 검증 전략을 개발한다. 
변경된 소프트웨어 유닛의 재검증을 위한 회귀 전략을 포함한 소프트웨어 유닛 검증에 대한 전략을 
개발한다. 검증 전략은 소프트웨어 유닛이 소프트웨어 상세 설계와 비기능적 요구사항을 준수함에 
대한 증거를 제공하는 방법을 정의해야 한다.   [성과 1]

비고 1: 유닛 검증을 위해 가능한 기법은 정적/동적 분석, 코드 검토, 유닛 시험 등을 포함한다.


SWE.4.BP2: 유닛 검증을 위한 기준을 개발한다. 
소프트웨어 유닛들과 컴포넌트 내 유닛들 간의 상호작용이 소프트웨어 상세 설계와 비기능적 요구사항
을 준수하고 있다는 증거를 제공하기에 적합한 유닛 검증 기준을 검증 전략에 따라 개발한다. 
유닛 시험의 경우, 기준은 유닛 시험 명세서에 정의되어야 한다. [성과 2]

비고 2: 유닛 검증을 위한 가능 기준은 유닛 시험 케이스, 유닛 시험 데이터, 정적 검증, 커버리지 목표, MISRA 규칙과 같은 코딩 표준을 포함한다.
비고 3: 유닛 시험 명세서는 예를 들면, 자동 시험 벤치의 스크립트로 구현될 수 있다.

  08-50 시험 명세서 → [성과 2]
08-52 시험 계획서 → [성과 1]
13-04 의사소통 기록 → [성과 5]
13-19 검토 기록 → [성과 3, 4]
13-22 추적성 기록 → [성과 4]
13-25 검증 결과 → [성과 3, 5]
13-50 시험 결과 → [성과 3, 5]
15-01 분석 보고서 → [성과 3]

 

반응형

'임베디드 개발 노트' 카테고리의 다른 글

SocketCAN  (0) 2024.04.22
ALSA  (0) 2023.12.21
CAN (업데이트 中)  (0) 2023.06.20
Analog /Digital Signal , Ground  (0) 2023.04.06
시리얼 통신  (0) 2022.12.15
반응형

메시지 포맷

• SOF ( Start Of Frame)
- 후술할 우성 비트(‘d’) 한개로 구성되어 있으며, 메시지의 처음을 지시하고 모든 노드의 동기화를 위해 사용된다.
• Arbitration Field
- 11비트 또는 29비트의 크기를 갖는 ID와 1비트의 RTR비트로 구성된다. 둘 이상의 노드에서 메시지의 전송이 동시에
일어나는 경우 발생하는 메시지 간의 충돌을 조정하는데 사용된다. RTR비트는 데이터 프레임이나 리포트 프레임을 구분
하는데 사용한다.
• Control Field
- 2비트의 IDE(Identificer Extension)비트, 4비트의 데이터 길이 코드로 구성된다.
• Data Field
- 8bytes까지 사용 가능하며, 데이터를 저장하는데 사용된다.
• CRC Field
- SOF부터 데이터 필드까지의 비트열을 이용해 생성한 15비트의 CRC시퀀스와 CRC 델리미터로 구성되어 있다. 메시지
상의 에러 유무를 검사하는데 사용된다.
• ACK Field
- 한 비트의 ACK슬롯과 하나의 ACK 델리미터로 구성되어 있다. 임의의 노드에서 올바른 메시지를 수신하게 되면 ACK필
드를 받는 순간 ACK슬롯의 값을 ‘d’비트로 설정한다.
• EOF
- 7개의 후술할 ‘r’비트로 구성되어 메시지의 끝을 알리는데 사용된다.

 


네트워크 동작

 

CAN 통신은 직렬 버스 방식으로 2개의 꼬임 쌍선으로 이루어져 있다.
CAN_H와 CAN_L로 버스를 구성하며 CAN_H는 3.5V가 0, 2.5V가 1이고 CAN_L는 1.5V가 0, 2.5V가 1이 된다.

그러므로 CAN_H와 CAN_L의 전위차가 2일 시 0으로 인식하고, 0일 시 1로 인식한다.
일반적인 상황에서는 위와 같은 전위차를 내지만 ECU가 많아 질수록 오차범위가 넓어지므로 통상 전위차가 0.9 이상일 때
0으로 인식하고 0.5 이하일 때 1로 인식한다.
또한 버스 라인의 종단 저항은 각 노드들의 신호를 한번만 수신하기 위해 필요하며 없을 시 신호가 회로에 계속 남아 있게
된다.

 

 

Tranceiver

CAN Transceiver는 버스에 있는 데이터를 Controller에게 보내주는 역할을 하며 각 선로에 맞는 전압으로 조정해준다.
MCU의 전압은 0과 3.3V 또는 5V이고, 버스의 전압은 3.5V, 2.5V, 1.5V를 기준으로 한다.

 

Dominant, Recessive

 

CAN 네트워크는 0을 우성(Dominant, d), 1을 열성(Recessive, r)으로 논리적으로 정해져 있다.
이 특성은 버스 라인에 0과 1이 동시에 흐를때 0이 1을 덮어 쓰도록 되어 있다.
Bus라인은 종단 저항에 의해서 전류가 일정하게 흐르고 각 노드가 열성 비트를 보내거나 어떤 노드도 신호를 보내지 않을때는 전류가 흐르지 않는다. 즉, 우성(d) 비트가 전송될 때만 버스에 전류가 흐르게 된다.
VCC(5V)와 GND를 포함한 Tranciever의 간략한 구성은 다음과 같다.

CAN_L는 항상 CAN_H 반대 논리를 갖고 있으므로 TX의 신호는
CAN_H 선로에 영향을 주고 TX의 반전된 신호는 CAN_L 선로에
영향을 준다.
TX가 LOW일때 CAN_H는 P채널 모스펫에 의해 전압원을 연결시
켜주고 CAN_L는 N채널 모스펫에 의해 GND와 연결되어 버스에 전
류가 흐르게 된다. 흐르는 전류는 종단 저항에 의해 3.75V와 1.25V
로 측정된다.
TX가 HIGH일때는 전압원과 GND가 연결되지 않아 전류가 흐르지
않는다.
따라서 노드들이 모두 HIGH를 보내지 않는 이상 버스는 Dominant
가 지배하게 된다.
RX로 받는 신호는 CAN_H와 CAN_L의 차동 전압을 계산한 값에
따라 논리 값을 정한다.

 

 


Arbitration

 

ECU1과 ECU2가 같은 시점에 메시지를 보낸다고 할때 우선권은 Identifier Field의 값이 낮은 순서로 주어진다.
위의 회로도처럼 TX로 메시지를 보냄과 동시에 RX로 수신을 하기 때문에 Arbitration 동안에 각 노드들은 버스를 모니터링한다.
또한 Arbitration에서 진 노드는 Controller에서 전압을 보내지 않는다.

TX를 통해 두 노드가 동시에 신호를 보낼 때 버스까지 간다면 두 노드의 신호 중 Dominant가 버스를 지배하므로 노드들은 본인의 TX와 RX를 비교하여 본인이 졌는지 확인할 수 있다.

반응형

'임베디드 개발 노트' 카테고리의 다른 글

SocketCAN  (0) 2024.04.22
ALSA  (0) 2023.12.21
Automotive SPICE (업데이트 中)  (0) 2023.06.20
Analog /Digital Signal , Ground  (0) 2023.04.06
시리얼 통신  (0) 2022.12.15
반응형

Analog Signal

  • AC/DC 성분으로 이루어져 있다.
    AC : 교류 (극성이 바뀌는 신호)
    DC : 직류 (극성이 바뀌지 않는 신호)
  • Sin / Cos 신호를 AC라고 부르기도 한다.

Digital Signal

  • High/Low 두개의 값만 가질 수 있다.
  • Digital 신호는 임계값(Threshhold)이 특정 값 이상이면 High, 그 이하면 Low로 분류한다.
  • HIgh Impedance / Floating
    • 저항이 아주 높은 상태를 의미하며, 끊어진 상태는 아니다.

5V Digital Signal

Ground(GND)

  • Ground는 Earth와 Signal Ground로 나뉜다.
  • Earth : 직접 땅에 연결
  • Signal Ground
    • PCB에 전지의 "-" 극을 저항이 적은 넓은 모양의 Case나 PCB 기판의 뒷면등에 연결하여
      전류가 몰리는 환경을 구성하고, 전위 기준으로 사용한다.
반응형

'임베디드 개발 노트' 카테고리의 다른 글

SocketCAN  (0) 2024.04.22
ALSA  (0) 2023.12.21
Automotive SPICE (업데이트 中)  (0) 2023.06.20
CAN (업데이트 中)  (0) 2023.06.20
시리얼 통신  (0) 2022.12.15
반응형

Ensemble 모델은 여러 개의 기본 모델들을 조합하여 정확한 예측을 수행하는 머신러닝 기법

Ensemble 모델에는 여러 가지 방법이 있지만, 대표적으로는 아래와 같은 4가지 방법이 있다

 

  • 보팅 (Voting)
    • 여러 모델의 예측을 모아서 다수결로 최종 예측을 결정하는 방법이며, 여러 모델이 서로 다른 샘플에서 높은 정확도를 보일 때 효과적입니다.
  • 배깅 (Bagging)
    • 데이터셋을 여러 개로 나누어서 각 모델에게 다른 데이터셋을 학습하도록 하는 방법.
    • 각 모델이 다양한 관점에서 학습할 수 있으며, 이들의 예측을 평균내어 최종 예측을 결정 .
    • 대표적으로 랜덤 포레스트 (Random Forest)가 있습니다.
  • 부스팅 (Boosting)
    • 부스팅은 여러 모델이 연속적으로 학습하도록 하여, 이전 모델이 잘못 예측한 샘플에 더 집중하도록 하는 방법.
    • 약한 모델들을 강력한 모델로 합치는 효과를 가지며, 대표적으로 그래디언트 부스팅 (Gradient Boosting)과 XGBoost가 있습니다.
  • 스태킹 (Stacking)
    • 스태킹은 여러 모델의 예측값을 다시 입력으로 사용하여 새로운 모델을 학습시키는 방법.
    • 각 모델이 다른 관점에서 데이터를 학습하게 하여 더 강력한 예측을 수행할 수 있다.

Ensemble 모델을 구성할 때는 다음과 같은 점에 유의해야 합니다.

 

  1. 다양한 모델 선택
    모델 간에 상관관계가 작아지도록 서로 다른 모델을 사용하는 것이 중요합니다.
    예를 들어, 다양한 알고리즘과 하이퍼파라미터를 사용하여 서로 다른 모델을 만들 수 있습니다.
  2. 데이터 다양성
    모델 간의 다양성을 높이기 위해, 각 모델에게 학습할 데이터를 다르게 제공할 수 있습니다.
    이를 위해 배깅이나 부스팅과 같은 앙상블 기법을 사용할 수 있습니다.
  3. 모델 수 조절
    Ensemble 모델에 사용할 모델의 수를 적절히 조절하는 것이 중요합니다.
    모델 수가 너무 적으면 성능이 좋아지지 않을 수 있으며, 모델 수가 너무 많으면 학습 및 예측 속도가 느려지고,
    과적합 문제가 발생할 수 있습니다.
  4. 모델 조합
    Ensemble 모델에 사용할 모델을 조합하는 방법도 중요합니다.
    모델 간의 상관관계를 최소화하면서, 성능이 높은 모델끼리 조합하는 것이 좋습니다.
    이를 위해 보팅, 배깅, 부스팅, 스태킹 등 다양한 앙상블 기법을 사용할 수 있습니다.
  5. 모델 평가
    Ensemble 모델을 구성한 후에는 각 모델의 예측력을 평가하여, 성능이 좋은 모델들을 선택하고,
    나쁜 모델들은 제외하는 것이 좋습니다.이를 위해 교차 검증 등을 사용하여 모델의 성능을 평가할 수 있습니다.
반응형

'AI > ML' 카테고리의 다른 글

넘파이 (NumPy) - ndarray , 관련 함수들  (0) 2023.01.06
Machine Learning (with Python)  (0) 2023.01.06
반응형
행렬을 표현하는 클래스, 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
반응형
NumPy는 Numerical Python을 의미한다.
파이썬에서 선형대수 기반의 프로그램을 쉽게 만들 수 있도록 지원하는 대표적인 패키지다.
  • NumPy는 C/C++과 같은 저수준 언어 기반의 호환 API를 제공한다.
  • NumPy는 빠른 배열 연산을 보장하지만, 파이썬 언어 자체가 가지는 수행 성능의 제약으로 중요한 부분은 
    C/C++ 기반의 코드로 작성하고 이를 NumPy에서 호출하는 방식으로 통합한다. (Tensorflow가 대표적인 예시)

 

ndarray 개요

<NumPy ndarray 배열의 차원들>

array1 = np.array([1, 2, 3])
print('array1 type:', type(array1))
print('array1 array 형태:', array1.shape)

array2 = np.array([[1, 2, 3],
                   [2, 3, 4]])
                   
print('array2 type:', type(array2))
print('array2 array 형태:', array2.shape)

array3 = np.array([[1, 2, 3]])
print('array3 type:', type(array3))
print('array3 array 형태:', array3.shape)
  • ndarray로 변환을 원하는 객체를 인자로 입력하면 ndarray를 반환한다.
  • ndarray.shape는 ndarray의 차원과 크기를 튜플(tuple)로 나타낸다.
  • [1, 2, 3]인 array1의 shape는 (3,) 이다.
    → 1차원 array로 3개의 데이터를 가지고 있음을 뜻함.
  • [[1,2,3], [2,3,4]]인 array2의 shape는 (2,3) 이다.
    → 2차원 array로, 2개의 low와 3개의 column으로 구성되어 2*3 = 6개의 데이터를 가지고 있음을 뜻함.
  • [[1,2,3]]인 array3의 shape는 (1,3) 이다.
    → 1개의 low 3개의 column으로 구성된 2차원 데이터를 의미함.

ndarray 데이터 타입

import numpy as np

list1 = [1, 2, 3]
print(type(list1))

array1 = np.array(list1)
print(type(array1))
print(array1, array1.dtype)

 

import numpy as np

list1 = [1, 2, 'test']
array1 = np.array(list1)
print(array1, array1.dtype)

list2 = [1, 2, 3.0]
array2 = np.array(list2)
print(array2, array2.dtype)​

 


NumPy 관련 함수 정리

  • astype( ) : 데이터값의 타입 변경
array_int = np.array([1, 2, 3])
array_float = array_int.astype('float64')
print(array_float, array_float.dtype)

  • arange( ) : array를 range ()로 표현하는 것. 
sequence_array = np.arange(10)
print(sequence_array)
print(sequence_array.dtype, sequence_array.shape)

  • zeros( ), ones( ) : 0과 1로 초기화
zero_array = np.zeros((3, 2), dtype='int32') #dtype을 정하지 않으면 float64로 array 채움
print(zero_array)
print(zero_array.dtype, zero_array.shape)

ones_array = np.ones((3, 2))
print(ones_array)
print(ones_array.dtype, ones_array.shape)

 

반응형

'AI > ML' 카테고리의 다른 글

Ensemble (앙상블)  (0) 2023.02.21
Machine Learning (with Python)  (0) 2023.01.06
반응형
본 카테고리 글들은 "파이썬 머신러닝 완벅 가이드" 라는 책을 보고 작성하였습니다.
 + 강의 내용 및 책 내용을 요약하여 정리하였음.

머신러닝의 개념

머신러닝이란, 데이터를 기반으로 패턴을 학습하고 결과를 예측하는 알고리즘 기법을 통칭한다.


머신러닝의 분류

지도학습

  • 분류
  • 회귀
  • 추천 시스템
  • 시각/음성 감지/인지
  • 텍스트 분석, NLP

비지도학습

  • 클러스터링
  • 자원 축소
  • 강화 학습

파이썬 머신러닝 주요 패키지

  • 머신러닝 패키지
    • 사이킷런(Scikit-Learn)
    • DL Library : Tensorflow, Keras, Pytorch
  • 행렬/선형대수/통계 패키지
    • 머신러닝의 이론적 백그라운드는 선형대수와 통계로 이뤄져 있다
    • NumPy : 행렬과 선형대수를 다루는 패키지
    • SciPy : 자연과학과 통계를 위한 패키지
  •  데이터 핸들링
    • Pandas : 데이터 처리 패키지
                     :: 2차원 데이터 처리에 특화되어 있다
                     :: Matplotlib를 호출해 쉽게 시각화 기능을 지원 가능
  • 시각화
    • Matplotlib / Seaborn : 시각화 패키지

 

반응형

'AI > ML' 카테고리의 다른 글

Ensemble (앙상블)  (0) 2023.02.21
넘파이 (NumPy) - ndarray , 관련 함수들  (0) 2023.01.06
반응형

영상의 화소 처리 기법

화소 처리 (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)

출력 결과 값

 

반응형

+ Recent posts