일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- blip-2
- vlm hallucination
- dinov2 논문 리뷰
- vlm 환각이란
- dinov2: learning robust visual features without supervision 논문 리뷰
- 논문 요약
- clip adapter
- object detection
- evaluating object hallucination in large vision-language models paper
- 엔트로피란
- vlm hallucination paper
- 논문 리뷰
- 객체 검출
- 에지 검출
- 딥러닝 엔트로피
- polling-based object probing evaluation
- 기계학습
- clip
- 이미지 필터링
- evaluating object hallucination in large vision-language models 논문
- vlm
- 1차 미분 마스크
- 원격 학습 안끊기게
- mobilenetv1
- Object detection article
- 딥러닝 목적함수
- dinov2: learning robust visual features without supervision 논문
- evaluating object hallucination in large vision-language models
- vlm 환각
- dinov2: learning robust visual features without supervision
- Today
- Total
My Vision, Computer Vision
[딥러닝 공부] 이미지 샤프닝, 블러링, 1차 미분 마스크 본문
이 글은
『정성환, 배종욱, OpenCV-Python으로 배우는 영상 처리 및 응용, 생능출판2020년)』
에서 공부한 내용을 토대로 작성되었다.
회선(Convolution)
마스크의 크기가 3 * 3이고 입력 이미지와 출력 이미지의 크기가 같다고 하자.
이 때 한 픽셀에서 컨볼루션 연산을 수행하면 그 픽셀의 주변 8픽셀까지 출력 픽셀에 관여하게 된다.
마스크의 값을 잘 조절하면 블러링, 샤프닝 등과 같이 원하는 특징을 부각시켜 출력 이미지를 만들 수 있게 된다.
블러링
# 이미지 파일 경로
image_path = "~~/~~/001.jpg"
image = cv2.imread(image_path)
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 가우시안 블러링(커널 크기, 표준 편차 설정)
blurred_image = cv2.GaussianBlur(image_rgb, (5, 5), 0)
마스크 각각의 값은 1보다 작으면서 같고, 모든 합이 1이면 블러링 처리가 된다.
$\frac{1}{9}$ | $\frac{1}{9}$ | $\frac{1}{9}$ |
$\frac{1}{9}$ | $\frac{1}{9}$ | $\frac{1}{9}$ |
$\frac{1}{9}$ | $\frac{1}{9}$ | $\frac{1}{9}$ |
마스크가 위와 같고 한 픽셀에서 컨볼루션 연산을 수행한다고 하자.
다음 출력 픽셀을 계산할 때 이전 픽셀과 주변 8픽셀을 포함한 9개의 픽셀이 모두 1/9만큼 다음 출력 픽셀에 반영된다.
즉 주변 픽셀끼리 비슷한 값을 가지게 되어 흐려지는 효과가 나타나는 것이다.
이 때 마스크의 합은 1이기 때문에 밝기는 크대로 유지된다.
밝기가 그대로 유지된다는 것
컨볼루션 연산을 수행할 때, 마스크의 합이 1이면 이미지의 밝기는 그대로 유지된다.
픽셀은 0~255 사이의 밝기 값을 가지는데, 마스크의 값이 1보다 작으면
출력 픽셀 값의 스케일이 작아지게 되므로 밝기가 낮아지게 되는 것이다.
샤프닝
# 이미지 파일 경로
image_path = "~~/~~/001.jpg"
image = cv2.imread(image_path)
image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
# 샤프닝 마스크 생성
sharpening_kernel = np.array([[0, -1, 0],
[-1, 5, -1],
[0, -1, 0]])
# 이미지에 샤프닝 적용
sharpened_image = cv2.filter2D(image_rgb, -1, sharpening_kernel)
블러링은 주변 픽셀의 값을 비슷하게 만들었지만
샤프닝에서는 마스크 원소들의 값 차이가 커지도록 구성함으로써 해당 픽셀과 주변 픽셀의 차이를 크게 만든다.
마스크의 중심을 중심계수, 주변을 주변계수라고 한다.
중심계수를 주변계수보다 큰 값을 가지게하고 블러링과 같이 마스크의 합이 1이되게 하면 밝기가 유지되는 샤프닝 마스크를 만들 수 있다.
이 때, 주변계수는 주변 화소의 비중을 감소시킬 수 있도록 음수 값을 갖게한다.
중심계수와 주변계수의 차이가 커질수록 샤프닝 효과가 강해진다.
0 | -1 | 0 |
-1 | 5 | -1 |
0 | -1 | 0 |
에지
영상처리에서 에지는 화소값이 급격하게 변화하는 부분으로 정의한다.
화소값이 높 -> 낮 / 낮 - > 높아지는 부분을 에지라고 한다.
이미지에서 에지를 검출하는 방법에는 이웃하는 화소의 차분이 특정 임계값보다 높으면 에지로 지정하거나 1차 미분 마스크나 2차 미분 마스크를 이용하는 것이 있다.
1차 미분 마스크
미분은 함수의 순간 변화율을 계산하는 과정을 의미한다.
에지는 화소가 급격히 변화하는 부분이기 때문에 함수의 변화율을 취하는 미분 연산을 통해 에지를 검출할 수 있다.
화소에서 밝기의 기울기를 계산하고 이 기울기의 크기를 구하면 에지가 된다.
하지만 이미지, 영상은 연속된 값이 아닌 이산된 데이터가 나열되어 있기 때문에 미분이 불가능하고, 따라서 해당 화소에서의 기울기는 구하지 못하지만 주변 화소와의 기울기로 근사할 수 있다.
$G[f(x,y)] = \begin{bmatrix} G_x \\ G_y \end{bmatrix} = \begin{bmatrix} \frac{\partial f(x,y)}{\partial x} \\ \frac{\partial f(x,y)}{\partial y} \end{bmatrix} $
$(x,y)$에서의 픽셀값을 $f(x,y)$라 하고, 기울기의 크기($G[f(x,y)]$)를 구하기 위해 각각의 축에 대한 미분값($G_x, G_y$)을 편미분($\partial x, \partial y$)으로 구한다.
그렇다면 $(x,y)$에서 $x$축에 대한 미분값은
$G_x = \lim_{dx \to 1}\frac{f(x+dx,y) - f(x,y)}{dx} \fallingdotseq f(x+1, y) - f(x,y), dx=1 $
위와 같이 $f(x+1,y) - f(x,y)$ 로 나타낼 수 있고 $y$축에 대한 미분값은
$G_x = \lim_{dx \to 1}\frac{f(x+dx,y) - f(x,y)}{dx} \fallingdotseq f(x+1, y) - f(x,y), dx=1 $
위와 같이 $f(x, y+1) - f(x,y)$로 나타낼 수 있다.
픽셀은 연속 데이터가 아니고 이산 데이터이기 때문에, $dx, dy$를 한 화소 단위의 차분으로 근사한 것이다.
마지막으로 L2 norm으로 기울기의 크기(에지)를 구하면
$G[f(x,y)] \doteqdot \sqrt{G_x^2 + G_y^2} \approx |G_x| + |G_y|$ 이다. (L2 norm을 L1 norm으로 근사)
최종적으로 $G_x$ 와 $G_y$의 합으로 에지를 검출할 수 있는 것이다.
$f(x-1,y-1)$ | $f(x,y-1)$ | $f(x+1,y-1)$ |
$f(x-1,y)$ | $f(x,y)$ | $f(x+1,y)$ |
$f(x-1,y+1)$ | $f(x,y+1)$ | $f(x+1,y+1)$ |
중심 픽셀이 $(x,y)$라고하면 주변 픽셀의 크기를 위와 같이 표현할 수 있다.
에지를 검출하려면 $f(x, y+1), f(x,y)$와 $f(x+1,y) - f(x,y)$ 를 얻어야 한다. 따라서 에지 검출 마스크는
0 | 0 | 0 |
0 | -1 | 0 |
0 | 1 | 0 |
$y$ 방향 마스크
0 | 0 | 0 |
0 | -1 | 1 |
0 | 0 | 0 |
$x$ 방향 마스크
이렇게 구성하여 $G[f(x,y)] = f(x,y+1) - f(x,y) + f(x+1,y) - f(x,y)$ 에지를 검출할 수 있다.
즉 $f(x,y)$와 $f(x+1,y), f(x,y+1)$ 사이의 변화량은 $f(x,y)$의 화소를 기준으로 바로 아래에 있는 화소와 오른쪽에 있는 화소와의 기울기를 의미한다.
1차 미분 마스크에 y 방향 마스크와 x 방향 마스크를 적용하면 출력값이 $f(x,y+1) - f(x,y), f(x+1,y)-f(x,y)$ 가 되어 $G_x, G_y$ 가 구해지게 된다. 최종적으로 기울기의 크기 $G[f(x,y)]$를 구하면 출력 이미지가 완성된다.
로버츠 마스크(Roberts)
1 | 0 | 0 |
0 | -1 | 0 |
0 | 0 | 0 |
대각방향 마스크1
0 | 0 | 1 |
0 | -1 | 0 |
0 | 0 | 0 |
대각방향 마스크2
위는 로버츠 마스크를 이미지에 적용한 예시이다. dst1과 dst2는 각각 대각방향 마스크1, 2를 적용한 것이고 roberts egde는 dst1과 dst2의 크기를 합한 것이다.
대각방향 마스크1은 11시 방향으로 마스크가 구성되어 있는데, dst1은 왼쪽 위 대각선에 해당하는 에지가 검출되어 있다.
이는 대각방향 마스크1이 왼쪽 위에서 오른쪽 아래로 값이 크게 변화하는 부분을 검출하기 때문에 dst1과 같은 결과가 나타나는 것이다.
로버츠 마스크는 계산이 단순하지만 한 번만 차분을 계산하기 때문에 차분의 크기가 작고, 이로 인해서 경계가 확실한 에지만을 추출하며, 잡음에 매우 민감하다.
차분을 한 번만 계산한다는 것
로버츠 마스크로 연산을 1회 수행했을 때 $f(x-1,y-1) - f(x,y)$와 같이 하나의 픽셀 관계에 대해서만 연산되므로 차분이 한 번만 계산된다고 할 수 있다.
하지만 마스크가 위와 같이 구성되어있다면 ${f(x+1,y-1) - f(x-1,y-1)} + {f(x+1, y) - f(x-1,y)} \\ + {f(x+1,y+1) - f(x-1,y+1)}$ 처럼 차분이 총 3번 계산된 것을 확인할 수 있다.
-1 0 1 -1 0 1 -1 0 1
'공부' 카테고리의 다른 글
[딥러닝 공부] 노이즈 제거를 위한 이미지 필터링(평균, 미디언, 가우시안) (3) | 2025.01.02 |
---|---|
[딥러닝 공부] 노이즈 제거를 위한 이미지 필터링(평균, 미디언, 가우시안) (0) | 2024.12.30 |
[딥러닝 공부] 1차, 2차 미분 마스크, 에지 검출 (0) | 2024.12.24 |
[딥러닝 공부] 정보 이론과 엔트로피 (1) | 2024.12.18 |
[딥러닝 공부] FFT, 퓨리에 변환이란? (1) | 2024.06.25 |