커널(영상처리)
Kernel (image processing)![]() |
이미지 처리에서 커널(Kernel), 컨벌루션 매트릭스(Convolution Matrix) 또는 마스크(Mask)는 블러링, 샤프닝, 엠보싱, 에지 검출 등에 사용되는 작은 매트릭스입니다.이것은 커널과 이미지 사이에 컨볼루션을 수행함으로써 달성됩니다.또는, 출력 이미지 내의 각 픽셀이 입력 이미지 내의 주변 픽셀들(자신을 포함)의 함수일 때, 커널은 그 함수입니다.
세부 사항
컨볼루션의 일반적인 표현은
여기서 y 은 필터링된 이미지, y 은(는) 원래 이미지,ω \omega}은(는) 필터 커널입니다.필터 커널의 모든 요소는 a 및 b에 의해 간주됩니다
요소 값에 따라 커널은 광범위한 영향을 미칠 수 있습니다.
작동 | 커널(Kernel) | 영상결과 g(x,y) |
---|---|---|
신원 | ![]() | |
Ridge 또는 Edge detection | ![]() | |
![]() | ||
깎다 | ![]() | |
박스 흐림 (정규화됨) | ![]() | |
가우스 블러 3 x 3 (근사) | ![]() | |
가우스 블러 5 x 5 (근사) | ![]() | |
선명하지 않은 마스킹 5 x 5 가우스 블러 기준 양이 1이고 임계값(0) (이미지 마스크 없음) |
| ![]() |
위의 내용은 커널과 이미지를 컨볼루션하여 달성할 수 있는 효과의 몇 가지 예에 불과합니다.
기원.
원점은 (개념적으로) 현재 출력 픽셀 위에 있는 커널의 위치입니다.이것은 실제 커널 밖에 있을 수 있지만 보통 커널 요소 중 하나에 해당합니다.대칭 커널의 경우 원점은 대개 중심 요소입니다.
컨벌루션

컨볼루션은 커널에 의해 가중치가 부여된 이미지의 각 요소를 로컬 이웃에 추가하는 프로세스입니다.이것은 수학적 컨볼루션의 한 형태와 관련이 있습니다.수행 중인 행렬 연산(컨벌루션)은 *로 유사하게 표시되지만 기존 행렬 곱셈이 아닙니다.
예를 들어, 첫 번째 커널과 두 번째 이미지 조각인 두 개의 3x3 행렬이 있는 경우, 컨볼루션은 커널의 행과 열을 모두 뒤집고 국부적으로 유사한 항목을 곱하고 합산하는 과정입니다.결과 이미지의 좌표 [2, 2](즉, 중심 요소)에 있는 요소는 커널에 의해 주어진 가중치와 함께 이미지 행렬의 모든 항목의 가중 조합이 될 것입니다.
다른 항목들도 마찬가지로 가중치가 부여되어 커널의 중심을 이미지의 각 경계점에 위치시키고 가중치가 부여된 합을 계산합니다.
출력 영상에서 특정 픽셀의 값은 각 커널 값에 해당 입력 영상 픽셀 값을 곱하여 계산됩니다.이는 다음 의사 코드를 사용하여 알고리즘적으로 설명할 수 있습니다.
입력 이미지의 각 이미지 행에 대해: 이미지 행의 각 픽셀에 대해: 커널 행의 각 커널 행에 대해 누산기를 0으로 설정: 커널 행의 각 요소에 대해: 픽셀 위치에 대응하는 요소 위치*를 곱한 후 픽셀 값에 대응하는 요소 값*을 곱한 후 출력 이미지 픽셀을 누산기에 설정하면 결과를 누적기 끝에 추가합니다.
- *해당 입력 이미지 픽셀은 커널의 원점에 대해 상대적으로 발견됩니다.
커널이 대칭인 경우 커널의 중심(오리진)을 현재 픽셀에 놓습니다.커널은 원점 주위의 인접 픽셀과 겹칩니다.각 커널 요소는 중복되는 픽셀 값과 곱해야 하며 획득한 값은 모두 합산해야 합니다.이 결과 합은 현재 커널의 중앙에 중첩된 픽셀에 대한 새 값이 됩니다.
만약 커널이 대칭이 아니라면 위와 같이 컨벌루션을 계산하기 전에 커널은 수평축과 수직축을 중심으로 플립되어야 합니다.[1]
행렬 컨볼루션의 일반적인 형태는
에지 핸들링

커널 컨볼루션은 일반적으로 이미지 경계 밖의 픽셀에서 값을 요구합니다.이미지 가장자리를 처리하는 방법은 다양합니다.
- 확장하다
- 가장 가까운 경계 픽셀은 컨볼루션에 대한 값을 제공하기 위해 필요한 만큼 개념적으로 확장됩니다.모서리 픽셀은 90° 웨지로 확장됩니다.다른 에지 픽셀은 선으로 확장됩니다.
- 싼다
- 이미지는 개념적으로 래핑(또는 타일링)되며 값은 반대쪽 가장자리 또는 모서리에서 가져옵니다.
- 거울
- 이미지는 가장자리에서 개념적으로 미러링됩니다.예를 들어, 가장자리 바깥쪽에서 픽셀 3 단위를 읽으려고 하면 대신 가장자리 안쪽에서 하나 3 단위를 읽습니다.
- 자르기 / 겹침 방지
- 가장자리 너머의 값이 필요한 출력 영상의 픽셀은 생략됩니다.이 방법을 사용하면 가장자리를 잘라낸 상태에서 출력 영상이 약간 작아질 수 있습니다.이미지 외부의 값이 필요하지 않도록 커널을 이동합니다.머신 러닝은 주로 이 접근법을 사용합니다.예: 커널 크기 10x10, 이미지 크기 32x32, 결과 이미지는 23x23입니다.
- 커널 크롭
- 입력 영상을 지나 확장되는 커널의 픽셀은 사용되지 않으며 정규화는 보정하기 위해 조정됩니다.
- 일정한
- 영상 외부의 픽셀에 대해 상수 값을 사용합니다.보통 검정색이나 가끔 회색을 사용합니다.이는 일반적으로 적용 여부에 따라 달라집니다.
정규화
정규화는 커널의 각 요소를 모든 커널 요소의 합으로 나누는 것으로 정의되어 정규화된 커널의 요소의 합이 통일성이 됩니다.이렇게 하면 수정된 이미지의 평균 픽셀이 원래 이미지의 평균 픽셀만큼 밝습니다.
최적화
고속 컨볼루션 알고리즘은 다음과 같습니다.[2]
- 분리 가능한 컨볼루션
분리 가능 컨볼루션
M×N 커널을 사용하는 2D 컨볼루션은 각 샘플(픽셀)에 대해 M×N 곱셈이 필요합니다.커널이 분리 가능한 경우, 계산은 M + N 곱셈으로 감소할 수 있습니다.분리 가능한 컨볼루션을 사용하면 1D 컨볼루션을 하나의 2D 컨볼루션 대신 2번 수행하여 계산량을 크게 줄일 수 있습니다.[3]
실행
여기서 GLSL 쉐이딩 언어로 수행된 구체적인 컨볼루션 구현:
// 저자 : csblo // 상담만으로 이루어지는 작업: // https://en.wikipedia.org/wiki/Kernel_(image_processing) // 커널 정의 #define아이덴티티매트3(0,0,0,0,1,0,0,0,0) #define엣지0매트3(1,0, -1, 0, 0, 0, -1, 0, 1) #define엣지1매트3(0,1,0,1,-4,1,0,1,0,0) #define엣지2 매트3 (-1, -1, -1, -1, 8, -1, -1, -1, -1, -1) #define 깎는매트3(0, -1, 0, -1, 5, -1, 0, -1, 0) # define박스_blur매트3(1,1,1,1,1,1,1) * 0.1111 #define 가우스_blur매트3(1,2,1,2,4,2,1) * 0.0625 #define 엠보매트3 (-2, -1, 0, -1, 1, 1, 0, 1, 2) // 색인에서 행렬 요소의 좌표 찾기 vec2 kpos(인트 색인을 보다) { 돌아가다 vec2[9] ( vec2(-1, -1), vec2(0, -1), vec2(1, -1), vec2(-1, 0), vec2(0, 0), vec2(1, 0), vec2(-1, 1), vec2(0, 1), vec2(1, 1) )[색인을 보다] / i 해상도.xy의; } // UV 중심의 샘플러에서 3x3 차원 영역 추출 // 샘플러 : 텍스쳐 샘플러 // uv : 샘플러의 현재 좌표 // return : mat3의 배열, 각 인덱스는 컬러 채널에 대응합니다. 매트3[3] 지역 3x3(샘플러2D 샘플러, vec2 UV) { // 영역별 각 픽셀 만들기 vec4[9] 지역; 위해서 (인트 i = 0; i < 9; i++) 지역[i] = 식감(샘플러, UV + kpos(i)); // 3개의 색상 채널(빨간색, 녹색, 파란색)로 3x3 영역 매트3[3] m지역; 위해서 (인트 i = 0; i < 3; i++) m지역[i] = 매트3( 지역[0][i], 지역[1][i], 지역[2][i], 지역[3][i], 지역[4][i], 지역[5][i], 지역[6][i], 지역[7][i], 지역[8][i] ); 돌아가다 m지역; } // 커널로 텍스처를 컨볼루션 // 커널 : 컨볼루션에 사용되는 커널 // 샘플러 : 텍스쳐 샘플러 // uv : 샘플러의 현재 좌표 vec3 회심의(매트3 알맹이, 샘플러2D 샘플러, vec2 UV) { vec3 단편적인; // UV 중심의 3x3 영역 추출 매트3[3] 지역 = 지역 3x3(샘플러, UV); // 지역의 각 색상 채널에 대해 위해서 (인트 i = 0; i < 3; i++) { // 지역 채널 가져오기 매트3 rc = 지역[i]; // 지역 채널별 커널의 컴포넌트 와이즈 곱셈 매트3 c = 행렬Comp Mult(알맹이, rc); // 행렬의 각 성분을 추가합니다. 흘러가다 r = c[0][0] + c[1][0] + c[2][0] + c[0][1] + c[1][1] + c[2][1] + c[0][2] + c[1][2] + c[2][2]; // 채널 i의 fragment의 경우, set result 단편적인[i] = r; } 돌아가다 단편적인; } 공허한 메인이미지( 나가. vec4 fragColor, 인에 vec2 fragCoord ) { // 정규화된 픽셀 좌표(0 ~ 1) vec2 UV = fragCoord/i 해상도.xy의; // 질감이 있는 커널 컨볼루션 vec3 콜 = 회심의(양각의, 아이채널0, UV); // 화면으로 출력 fragColor = vec4(콜, 1.0); }
참고 항목
참고문헌
- ^ "Example of 2D Convolution".
- ^ 실제로 후드 아래에서 컨볼루션은 어떻게 수행됩니까?2019년 12월 13일 Anirudh Shenoy의 컨볼루션 속도를 높이기 위해 PyTorch & TensorFlow가 사용하는 간단한 트릭 2개
- ^ "Convolution". www.songho.ca. Retrieved 2022-11-19.
원천
- Ludwig, Jamie (n.d.). Image Convolution (PDF). Portland State University.
- Lecarme, Olivier; Delvare, Karine (January 2013). The Book of GIMP: A Complete Guide to Nearly Everything. No Starch Press. p. 429. ISBN 978-1593273835.
- Gumster, Jason van; Shimonski, Robert (March 2012). GIMP Bible. John Wiley & Sons. pp. 438–442. ISBN 978-0470523971.
- Shapiro, Linda G.; Stockman, George C. (February 2001). Computer Vision. Prentice Hall. pp. 53–54. ISBN 978-0130307965.