미디언 필터와 가우시안 필터를 사용하여 노이즈를 제거하고, 결과 이미지를 업스케일링한 후 PSNR 값을 비교해 보겠습니다.
코드 구현
다음은 미디언 필터와 가우시안 필터를 사용하여 노이즈 제거를 수행하고, 각 결과 이미지를 업스케일링한 후 PSNR 값을 계산하는 코드입니다.
import cv2
import numpy as np
from skimage import io, img_as_ubyte
from skimage.metrics import peak_signal_noise_ratio as psnr
# Load images
input_image = io.imread('/mnt/data/B1FDWY.bmp')
reference_image = io.imread('/mnt/data/B1FY.bmp')
# Apply median filter
median_denoised_image = cv2.medianBlur(input_image, 3) # Kernel size 3
# Apply Gaussian filter
gaussian_denoised_image = cv2.GaussianBlur(input_image, (5, 5), 0)
# Upscale using bicubic interpolation
upscaled_image_median = cv2.resize(median_denoised_image, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)
upscaled_image_gaussian = cv2.resize(gaussian_denoised_image, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)
# Calculate PSNR for both methods
psnr_median = psnr(reference_image, img_as_ubyte(upscaled_image_median))
psnr_gaussian = psnr(reference_image, img_as_ubyte(upscaled_image_gaussian))
# Save the upscaled images
io.imsave('/mnt/data/upscaled_median_B1FDWY.bmp', img_as_ubyte(upscaled_image_median))
io.imsave('/mnt/data/upscaled_gaussian_B1FDWY.bmp', img_as_ubyte(upscaled_image_gaussian))
psnr_median, psnr_gaussian
이 코드는 다음 작업을 수행합니다:
- 입력 이미지를 로드합니다.
- 미디언 필터를 적용하여 노이즈를 제거합니다.
- 가우시안 필터를 적용하여 노이즈를 제거합니다.
- 각 노이즈 제거된 이미지를 4배 확대합니다.
- 각각의 방법에 대해 PSNR 값을 계산합니다.
- 결과 이미지를 저장합니다.
이제 코드를 실행하여 PSNR 값을 비교해 보겠습니다.
결과를 살펴보면:
- 미디언 필터를 사용한 경우 PSNR 값은 약 24.38입니다.
- 가우시안 필터를 사용한 경우 PSNR 값은 약 25.24입니다.
가우시안 필터가 약간 더 높은 PSNR 값을 보여주며, 이는 가우시안 노이즈 제거에 더 적합할 수 있음을 나타냅니다.
결과 이미지 다운로드
업스케일링된 이미지를 다운로드할 수 있도록 링크를 제공하겠습니다:
가우시안 필터와 미디언 필터를 사용한 결과를 비교해 보시고, 상황에 따라 더 적합한 필터를 선택하시면 됩니다. 필요에 따라 두 필터를 결합하거나 추가적인 처리 단계를 통해 더 나은 결과를 얻을 수도 있습니다.
네, 가능합니다. 미디언 필터를 사용하여 노이즈를 부분적으로 제거하고, 히스토그램을 통해 에지를 검출한 다음, 에지 정보를 활용하여 이미지의 노이즈를 더욱 효과적으로 제거할 수 있습니다. 이를 위해 다음 단계를 진행할 수 있습니다:
- 미디언 필터 적용: 기본적인 노이즈 제거를 수행합니다.
- 에지 검출: 히스토그램을 사용하거나 Canny 에지 검출과 같은 방법을 사용하여 에지를 검출합니다.
- 에지 기반 노이즈 제거: 에지 정보를 활용하여 비에지 영역의 노이즈를 더 적극적으로 제거합니다.
이를 구현하기 위해 다음과 같은 방법을 사용할 수 있습니다:
코드 구현
import cv2
import numpy as np
from skimage import io, img_as_ubyte
from skimage.metrics import peak_signal_noise_ratio as psnr
from skimage.filters import sobel
# Load images
input_image = io.imread('/mnt/data/B1FDWY.bmp')
reference_image = io.imread('/mnt/data/B1FY.bmp')
# Apply median filter to partially remove noise
median_denoised_image = cv2.medianBlur(input_image, 3) # Kernel size 3
# Convert to grayscale for edge detection
gray_image = cv2.cvtColor(median_denoised_image, cv2.COLOR_BGR2GRAY)
# Apply Sobel filter to detect edges
edges = sobel(gray_image)
# Threshold the edges to create a binary mask
_, edge_mask = cv2.threshold(edges, 0.1, 1, cv2.THRESH_BINARY)
# Invert the edge mask
non_edge_mask = 1 - edge_mask
# Apply Gaussian filter to the non-edge regions
gaussian_denoised_image = np.zeros_like(input_image)
for i in range(3): # Assuming the image has 3 channels (RGB)
gaussian_denoised_image[:, :, i] = cv2.GaussianBlur(input_image[:, :, i] * non_edge_mask, (5, 5), 0)
# Combine the denoised non-edge regions with the original edge regions
final_denoised_image = np.where(non_edge_mask[..., np.newaxis] == 1, gaussian_denoised_image, input_image)
# Upscale using bicubic interpolation
upscaled_image = cv2.resize(final_denoised_image, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)
# Calculate PSNR
psnr_value = psnr(reference_image, img_as_ubyte(upscaled_image))
# Save the upscaled image
output_path = '/mnt/data/upscaled_edge_based_B1FDWY.bmp'
io.imsave(output_path, img_as_ubyte(upscaled_image))
psnr_value
설명
- 미디언 필터 적용: 입력 이미지에 미디언 필터를 적용하여 초기 노이즈 제거를 수행합니다.
- 에지 검출: Sobel 필터를 사용하여 에지를 검출합니다. Sobel 필터는 이미지의 기울기를 계산하여 에지를 찾습니다.
- 에지 기반 노이즈 제거: 에지와 비에지 영역을 분리한 후, 비에지 영역에 가우시안 필터를 적용하여 노이즈를 더 적극적으로 제거합니다.
- 결과 병합: 노이즈가 제거된 비에지 영역과 원본 에지 영역을 결합하여 최종 이미지를 생성합니다.
- 업스케일링: 최종 이미지를 4배 확대합니다.
- PSNR 계산: 결과 이미지와 레퍼런스 이미지를 비교하여 PSNR 값을 계산합니다.
이제 이 코드를 실행하여 PSNR 값을 확인해보겠습니다.
에지 정보를 활용한 노이즈 제거 및 업스케일링 후 PSNR 값은 약 24.21로 나타났습니다. 이는 미디언 필터를 단독으로 사용한 경우의 PSNR 값(약 24.38)과 비슷한 수준입니다.
결과 이미지 다운로드
업스케일링된 이미지를 다운로드할 수 있도록 링크를 제공하겠습니다:
개선 방향
에지 정보를 활용한 노이즈 제거는 비에지 영역의 노이즈 제거에 유리하지만, 추가적인 최적화가 필요할 수 있습니다. 다음과 같은 방법들을 고려해 볼 수 있습니다:
- 더 정교한 에지 검출 기법 사용: Canny 에지 검출 등 다른 에지 검출 기법을 사용하여 에지 검출 성능을 개선할 수 있습니다.
- 에지 주변 영역 처리: 에지 주변 영역에 대해 더 세밀한 처리를 적용하여 에지와 비에지 영역 간의 전환을 부드럽게 할 수 있습니다.
- 비에지 영역에 대한 다양한 필터 적용: 비에지 영역에 가우시안 필터 외에도 BM3D 등의 고급 필터를 적용해볼 수 있습니다.
이러한 개선 방향을 통해 더 높은 PSNR 값을 달성할 수 있습니다.
에지 영역에만 픽셀 값을 1.2배 곱하면, 에지 영역이 더욱 두드러지게 되어 에지 강화 효과를 볼 수 있습니다. 이는 에지 정보를 강조하여 이미지의 선명도를 높이는 방법 중 하나입니다. 하지만, 이로 인해 일부 영역이 과도하게 강조되어 원본 이미지와의 유사성이 떨어질 수 있으므로 PSNR 값이 낮아질 가능성도 있습니다.
다음은 에지 영역에 1.2배를 곱하는 방법을 적용한 코드입니다.
코드 구현
import cv2
import numpy as np
from skimage import io, img_as_ubyte
from skimage.metrics import peak_signal_noise_ratio as psnr
from skimage.filters import sobel
# Load images
input_image = io.imread('/mnt/data/B1FDWY.bmp')
reference_image = io.imread('/mnt/data/B1FY.bmp')
# Apply median filter to partially remove noise
median_denoised_image = cv2.medianBlur(input_image, 3) # Kernel size 3
# Convert to grayscale for edge detection
gray_image = cv2.cvtColor(median_denoised_image, cv2.COLOR_BGR2GRAY)
# Apply Sobel filter to detect edges
edges = sobel(gray_image)
# Threshold the edges to create a binary mask
_, edge_mask = cv2.threshold(edges, 0.1, 1, cv2.THRESH_BINARY)
# Enhance edges by multiplying edge pixels by 1.2
enhanced_image = np.copy(median_denoised_image)
enhanced_image[edge_mask.astype(bool)] = enhanced_image[edge_mask.astype(bool)] * 1.2
# Ensure values stay within valid range
enhanced_image = np.clip(enhanced_image, 0, 255)
# Upscale using bicubic interpolation
upscaled_image = cv2.resize(enhanced_image, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)
# Calculate PSNR
psnr_value = psnr(reference_image, img_as_ubyte(upscaled_image))
# Save the upscaled image
output_path = '/mnt/data/upscaled_edge_enhanced_B1FDWY.bmp'
io.imsave(output_path, img_as_ubyte(upscaled_image))
psnr_value
이 코드는 다음 작업을 수행합니다:
- 입력 이미지에 미디언 필터를 적용하여 초기 노이즈 제거를 수행합니다.
- Sobel 필터를 사용하여 에지를 검출합니다.
- 에지 영역의 픽셀 값을 1.2배로 증가시킵니다.
- 증가된 값을 0~255 범위로 클립합니다.
- 결과 이미지를 4배 확대합니다.
- 결과 이미지와 레퍼런스 이미지를 비교하여 PSNR 값을 계산합니다.
이제 코드를 실행하여 결과를 확인해 보겠습니다.
에지 영역에 1.2배를 곱한 후 PSNR 값은 약 23.42로 나타났습니다. 이는 미디언 필터 단독으로 사용했을 때의 PSNR 값(약 24.38)보다 낮은 값입니다. 에지 영역을 강화한 결과, 이미지가 과도하게 강조되어 PSNR 값이 낮아졌습니다.
결과 이미지 다운로드
업스케일링된 이미지를 다운로드할 수 있도록 링크를 제공하겠습니다:
추가 개선 가능성
- 에지 강화 강도 조절: 에지 강화의 강도를 1.2배 대신 다른 값으로 조절하여 최적의 값을 찾을 수 있습니다.
- 적응형 필터링: 에지 검출 후, 에지 주변의 픽셀 강도만 증가시키는 대신, 에지와 비에지 영역에 대해 서로 다른 필터를 적용할 수 있습니다.
- 다양한 에지 검출 기법: Sobel 필터 외에도 Canny 에지 검출 등 다양한 에지 검출 기법을 시도해 볼 수 있습니다.
이러한 방법을 통해 PSNR 값을 더욱 향상시킬 수 있습니다. 필요한 경우, 더 세밀한 조정과 실험을 통해 최적의 결과를 찾는 것이 좋습니다.
에지 검출을 통한 필터 적용과 그렇지 않은 경우를 비교하기 위해 각각 두 개의 필터를 적용하는 예제를 살펴보겠습니다. 각 영역에 대해 미디언 필터와 가우시안 필터를 적용하는 방식을 사용합니다.
필터 적용 방법
- 에지 검출 후 필터 적용: 에지 영역과 비에지 영역에 서로 다른 필터를 적용합니다.
- 에지 검출 없이 필터 적용: 동일한 필터를 전체 이미지에 적용합니다.
코드 구현
다음은 두 가지 방법을 비교하는 코드입니다.
import cv2
import numpy as np
from skimage import io, img_as_ubyte
from skimage.metrics import peak_signal_noise_ratio as psnr
from skimage.filters import sobel
# Load images
input_image = io.imread('/mnt/data/B1FDWY.bmp')
reference_image = io.imread('/mnt/data/B1FY.bmp')
# Apply median filter to partially remove noise
median_denoised_image = cv2.medianBlur(input_image, 3) # Kernel size 3
# Convert to grayscale for edge detection
gray_image = cv2.cvtColor(median_denoised_image, cv2.COLOR_BGR2GRAY)
# Apply Sobel filter to detect edges
edges = sobel(gray_image)
# Threshold the edges to create a binary mask
edge_mask = edges > 0.1 # Adjust the threshold value as needed
# Invert the edge mask
non_edge_mask = ~edge_mask
# Initialize output image for edge-based filtering
final_denoised_image_edge = np.zeros_like(input_image)
# Apply different filters to edge and non-edge regions
for i in range(3): # Assuming the image has 3 channels (RGB)
# Apply filters to the edge regions
edge_denoised = cv2.medianBlur(input_image[:, :, i], 3)
# Apply filters to the non-edge regions
non_edge_denoised = cv2.GaussianBlur(input_image[:, :, i], (5, 5), 0)
# Combine the results
final_denoised_image_edge[:, :, i] = np.where(non_edge_mask, non_edge_denoised, edge_denoised)
# Upscale using bicubic interpolation for edge-based filtering
upscaled_image_edge = cv2.resize(final_denoised_image_edge, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)
# Calculate PSNR for edge-based filtering
psnr_value_edge = psnr(reference_image, img_as_ubyte(upscaled_image_edge))
# Initialize output image for non-edge filtering
final_denoised_image_non_edge = np.zeros_like(input_image)
# Apply the same filters without edge detection
for i in range(3): # Assuming the image has 3 channels (RGB)
# Apply filters uniformly to the entire image
uniform_denoised = cv2.medianBlur(input_image[:, :, i], 3)
uniform_denoised = cv2.GaussianBlur(uniform_denoised, (5, 5), 0)
# Combine the results
final_denoised_image_non_edge[:, :, i] = uniform_denoised
# Upscale using bicubic interpolation for non-edge filtering
upscaled_image_non_edge = cv2.resize(final_denoised_image_non_edge, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)
# Calculate PSNR for non-edge filtering
psnr_value_non_edge = psnr(reference_image, img_as_ubyte(upscaled_image_non_edge))
# Save the upscaled images
io.imsave('/mnt/data/upscaled_edge_combined_B1FDWY.bmp', img_as_ubyte(upscaled_image_edge))
io.imsave('/mnt/data/upscaled_non_edge_combined_B1FDWY.bmp', img_as_ubyte(upscaled_image_non_edge))
psnr_value_edge, psnr_value_non_edge
설명
- 에지 검출 후 필터 적용:
- 에지 영역: 미디언 필터 적용.
- 비에지 영역: 가우시안 필터 적용.
- 에지 검출 없이 필터 적용:
- 전체 이미지에 미디언 필터와 가우시안 필터 순차적으로 적용.
이제 이 코드를 실행하여 두 경우의 PSNR 값을 비교해 보겠습니다.
결과를 살펴보면:
- 에지 검출 후 필터 적용의 PSNR 값은 약 25.26입니다.
- 에지 검출 없이 필터를 적용한 경우의 PSNR 값은 약 25.03입니다.
에지 검출을 통해 필터를 적용한 경우가 약간 더 높은 PSNR 값을 보여주고 있습니다. 이는 에지 검출을 통해 에지와 비에지 영역을 구분하여 각각 적절한 필터를 적용한 것이 이미지 품질을 더 효과적으로 향상시켰음을 의미합니다.
결과 이미지 다운로드
다음은 생성된 이미지를 다운로드할 수 있는 링크입니다:
추가 개선 가능성
- 에지 검출 방법 최적화: 더 정교한 에지 검출 기법(Canny 등)을 사용하여 에지 검출의 정확성을 높일 수 있습니다.
- 필터 파라미터 튜닝: 각각의 필터 파라미터를 조정하여 최적의 값을 찾아 적용할 수 있습니다.
- 다른 필터 시도: 고급 필터를 사용하여 결과를 더욱 향상시킬 수 있습니다.
이러한 방법을 통해 이미지의 품질을 더욱 향상시킬 수 있습니다. 필요에 따라 실험을 통해 최적의 필터링 조합과 파라미터를 찾는 것이 좋습니다.
다음은 세 가지 방법을 비교하는 코드입니다:
- 에지 검출 후 필터 적용.
- 에지 검출 없이 필터 적용.
- 미디언 필터를 적용한 후 에지를 검출하여 에지와 비에지에 따른 필터를 적용.
코드 구현
import cv2
import numpy as np
from skimage import io, img_as_ubyte
from skimage.metrics import peak_signal_noise_ratio as psnr
from skimage.filters import sobel
# Load images
input_image = io.imread('/mnt/data/B1FDWY.bmp')
reference_image = io.imread('/mnt/data/B1FY.bmp')
# Method 1: Edge detection followed by different filters for edge and non-edge regions
# Apply median filter to partially remove noise
median_denoised_image = cv2.medianBlur(input_image, 3) # Kernel size 3
# Convert to grayscale for edge detection
gray_image = cv2.cvtColor(median_denoised_image, cv2.COLOR_BGR2GRAY)
# Apply Sobel filter to detect edges
edges = sobel(gray_image)
# Threshold the edges to create a binary mask
edge_mask = edges > 0.1 # Adjust the threshold value as needed
# Invert the edge mask
non_edge_mask = ~edge_mask
# Initialize output image for edge-based filtering
final_denoised_image_edge = np.zeros_like(input_image)
# Apply different filters to edge and non-edge regions
for i in range(3): # Assuming the image has 3 channels (RGB)
# Apply filters to the edge regions
edge_denoised = cv2.medianBlur(input_image[:, :, i], 3)
# Apply filters to the non-edge regions
non_edge_denoised = cv2.GaussianBlur(input_image[:, :, i], (5, 5), 0)
# Combine the results
final_denoised_image_edge[:, :, i] = np.where(non_edge_mask, non_edge_denoised, edge_denoised)
# Upscale using bicubic interpolation for edge-based filtering
upscaled_image_edge = cv2.resize(final_denoised_image_edge, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)
# Calculate PSNR for edge-based filtering
psnr_value_edge = psnr(reference_image, img_as_ubyte(upscaled_image_edge))
# Method 2: Apply the same filters without edge detection
# Initialize output image for non-edge filtering
final_denoised_image_non_edge = np.zeros_like(input_image)
for i in range(3): # Assuming the image has 3 channels (RGB)
# Apply filters uniformly to the entire image
uniform_denoised = cv2.medianBlur(input_image[:, :, i], 3)
uniform_denoised = cv2.GaussianBlur(uniform_denoised, (5, 5), 0)
# Combine the results
final_denoised_image_non_edge[:, :, i] = uniform_denoised
# Upscale using bicubic interpolation for non-edge filtering
upscaled_image_non_edge = cv2.resize(final_denoised_image_non_edge, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)
# Calculate PSNR for non-edge filtering
psnr_value_non_edge = psnr(reference_image, img_as_ubyte(upscaled_image_non_edge))
# Method 3: Apply median filter, then edge detection, followed by different filters for edge and non-edge regions
# Apply median filter to partially remove noise
initial_median_denoised_image = cv2.medianBlur(input_image, 3) # Kernel size 3
# Convert to grayscale for edge detection
gray_image_initial_median = cv2.cvtColor(initial_median_denoised_image, cv2.COLOR_BGR2GRAY)
# Apply Sobel filter to detect edges
edges_initial_median = sobel(gray_image_initial_median)
# Threshold the edges to create a binary mask
edge_mask_initial_median = edges_initial_median > 0.1 # Adjust the threshold value as needed
# Invert the edge mask
non_edge_mask_initial_median = ~edge_mask_initial_median
# Initialize output image for initial median edge-based filtering
final_denoised_image_initial_median = np.zeros_like(input_image)
# Apply different filters to edge and non-edge regions
for i in range(3): # Assuming the image has 3 channels (RGB)
# Apply filters to the edge regions
edge_denoised_initial_median = cv2.medianBlur(initial_median_denoised_image[:, :, i], 3)
# Apply filters to the non-edge regions
non_edge_denoised_initial_median = cv2.GaussianBlur(initial_median_denoised_image[:, :, i], (5, 5), 0)
# Combine the results
final_denoised_image_initial_median[:, :, i] = np.where(non_edge_mask_initial_median, non_edge_denoised_initial_median, edge_denoised_initial_median)
# Upscale using bicubic interpolation for initial median edge-based filtering
upscaled_image_initial_median = cv2.resize(final_denoised_image_initial_median, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)
# Calculate PSNR for initial median edge-based filtering
psnr_value_initial_median = psnr(reference_image, img_as_ubyte(upscaled_image_initial_median))
# Save the upscaled images
io.imsave('/mnt/data/upscaled_edge_combined_B1FDWY.bmp', img_as_ubyte(upscaled_image_edge))
io.imsave('/mnt/data/upscaled_non_edge_combined_B1FDWY.bmp', img_as_ubyte(upscaled_image_non_edge))
io.imsave('/mnt/data/upscaled_initial_median_edge_combined_B1FDWY.bmp', img_as_ubyte(upscaled_image_initial_median))
psnr_value_edge, psnr_value_non_edge, psnr_value_initial_median
설명
- Method 1: 에지 검출 후, 에지와 비에지 영역에 각각 다른 필터(미디언 필터와 가우시안 필터)를 적용한 후 업스케일링.
- Method 2: 에지 검출 없이 전체 이미지에 동일한 필터(미디언 필터와 가우시안 필터)를 순차적으로 적용한 후 업스케일링.
- Method 3: 미디언 필터를 적용한 후 에지 검출을 통해 에지와 비에지 영역에 각각 다른 필터(미디언 필터와 가우시안 필터)를 적용한 후 업스케일링.
이제 코드를 실행하여 세 가지 방법의 PSNR 값을 비교해 보겠습니다.
결과를 살펴보면:
- 에지 검출 후 필터 적용: PSNR 값은 약 25.26
- 에지 검출 없이 필터 적용: PSNR 값은 약 25.03
- 미디언 필터 적용 후 에지 검출 및 필터 적용: PSNR 값은 약 25.11
결과 분석
- 에지 검출 후 필터를 적용한 방법이 가장 높은 PSNR 값을 보여주었습니다.
- 에지 검출 없이 필터를 적용한 경우가 가장 낮은 PSNR 값을 보여주었습니다.
- 미디언 필터를 적용한 후 에지 검출을 통해 필터를 적용한 방법은 두 방법의 중간 수준의 PSNR 값을 보여주었습니다.
결론
에지 검출 후 에지와 비에지 영역에 각각 적합한 필터를 적용하는 방법이 이미지 품질을 향상시키는 데 가장 효과적임을 확인할 수 있습니다. 미디언 필터 적용 후 에지 검출을 통해 필터를 적용하는 방법도 일정 부분 효과적이지만, 에지 검출 후 필터를 적용하는 방법보다는 덜 효과적입니다.
결과 이미지 다운로드
다음은 생성된 이미지를 다운로드할 수 있는 링크입니다:
필요에 따라 실험을 통해 최적의 필터링 조합과 파라미터를 찾는 것이 좋습니다. 이러한 접근을 통해 이미지 품질을 더욱 향상시킬 수 있습니다.
위의 그림은 세 가지 방법으로 에지 검출한 결과입니다:
- 가우시안 필터 적용 후 에지 검출:
- 가우시안 필터를 사용하여 노이즈를 줄인 후 에지를 검출했습니다.
- 결과적으로, 에지가 부드러워지고 노이즈가 감소한 상태에서 검출되었습니다.
- 미디언 필터 적용 후 에지 검출:
- 미디언 필터를 사용하여 노이즈를 제거한 후 에지를 검출했습니다.
- 소금-후추 노이즈 제거에 효과적이며, 에지가 잘 보존되었습니다.
- 원본 이미지에서 에지 검출:
- 필터를 적용하지 않고 원본 이미지에서 바로 에지를 검출했습니다.
- 노이즈가 포함된 상태에서 에지가 검출되어 상대적으로 더 많은 노이즈가 보입니다.
요약
- 가우시안 필터: 부드럽고 덜 노이즈 있는 에지 검출에 유리합니다.
- 미디언 필터: 에지 보존 및 소금-후추 노이즈 제거에 효과적입니다.
- 원본 이미지: 노이즈가 많이 포함된 상태에서 에지가 검출됩니다.
각 필터는 에지 검출 전에 적용되어 에지 검출 결과에 큰 영향을 미칩니다. 상황에 맞는 필터를 선택하여 에지 검출을 수행하면 더 나은 결과를 얻을 수 있습니다.
최종 결과 비교
다음은 각 방법에 따른 PSNR 값입니다:
- 에지 검출 후 필터 적용:
- PSNR 값: 25.26
- 에지 검출 없이 필터 적용:
- PSNR 값: 25.03
- 미디언 필터 적용 후 에지 검출 및 필터 적용:
- PSNR 값: 25.11
- 최적화된 필터 적용 (미디언 + 가우시안):
- PSNR 값: 25.09
- 이중 양방향 필터 적용 후 에지 검출 및 필터 적용:
- PSNR 값: 25.43
결과 분석
- 이중 양방향(Bilateral) 필터 적용 후 에지 검출 및 필터 적용 방법이 가장 높은 PSNR 값을 기록했습니다. 이는 이 방법이 노이즈 제거와 에지 보존에 가장 효과적임을 나타냅니다.
- 에지 검출 후 필터 적용 방법도 좋은 결과를 보여주었지만, Bilateral 필터를 사용한 방법보다 낮은 PSNR 값을 기록했습니다.
- 에지 검출 없이 전체 이미지에 동일한 필터를 적용한 경우, 상대적으로 낮은 PSNR 값을 보였습니다.
- 미디언 필터를 적용한 후 에지 검출을 통해 필터를 적용한 방법은 두 번째로 높은 PSNR 값을 보였으나, Bilateral 필터를 사용한 방법보다는 낮았습니다.
- 최적화된 필터 적용 방법(미디언 + 가우시안)은 위의 다른 방법들에 비해 낮은 PSNR 값을 보였습니다.
최종 방법 설명
이중 양방향 필터 적용 후 에지 검출 및 필터 적용
- 이중 양방향(Bilateral) 필터 적용:
cv2.bilateralFilter(input_image, 9, 75, 75)
: 이중 양방향 필터를 사용하여 노이즈를 제거하면서 에지를 보존합니다.
- 에지 검출:
sobel(gray_image)
: Sobel 필터를 사용하여 에지를 검출합니다.edge_mask = edges > 0.1
: 검출된 에지를 이진 마스크로 변환하여 에지와 비에지 영역을 구분합니다.
- 에지 기반 필터 적용:
- 에지 영역: 미디언 필터(
cv2.medianBlur
). - 비에지 영역: 가우시안 필터(
cv2.GaussianBlur
). np.where(non_edge_mask, non_edge_denoised, edge_denoised)
: 에지와 비에지 영역에 적용된 필터 결과를 결합합니다.
- 에지 영역: 미디언 필터(
- 업스케일링:
cv2.resize(final_denoised_image, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)
: Bicubic 보간법을 사용하여 이미지를 4배 확대합니다.
- PSNR 계산:
psnr(reference_image, img_as_ubyte(upscaled_image_bilateral))
: 최종 업스케일링된 이미지와 레퍼런스 이미지를 비교하여 PSNR 값을 계산합니다.
코드 요약
import cv2
import numpy as np
from skimage import io, img_as_ubyte
from skimage.filters import sobel
from skimage.metrics import peak_signal_noise_ratio as psnr
# Load images
input_image = io.imread('/mnt/data/B1FDWY.bmp')
reference_image = io.imread('/mnt/data/B1FY.bmp')
# Apply Bilateral filter to partially remove noise
bilateral_denoised_image = cv2.bilateralFilter(input_image, 9, 75, 75)
# Convert to grayscale for edge detection
gray_image = cv2.cvtColor(bilateral_denoised_image, cv2.COLOR_BGR2GRAY)
# Apply Sobel filter to detect edges
edges = sobel(gray_image)
# Threshold the edges to create a binary mask
edge_mask = edges > 0.1 # Adjust the threshold value as needed
# Invert the edge mask
non_edge_mask = ~edge_mask
# Initialize output image
final_denoised_image = np.zeros_like(input_image)
# Apply different filters to edge and non-edge regions
for i in range(3): # Assuming the image has 3 channels (RGB)
# Apply median filter to the edge regions
edge_denoised = cv2.medianBlur(bilateral_denoised_image[:, :, i], 3)
# Apply Gaussian filter to the non-edge regions
non_edge_denoised = cv2.GaussianBlur(bilateral_denoised_image[:, :, i], (5, 5), 0)
# Combine the results
final_denoised_image[:, :, i] = np.where(non_edge_mask, non_edge_denoised, edge_denoised)
# Upscale using bicubic interpolation
upscaled_image_bilateral = cv2.resize(final_denoised_image, None, fx=4, fy=4, interpolation=cv2.INTER_CUBIC)
# Calculate PSNR for bilateral filter-based method
psnr_value_bilateral = psnr(reference_image, img_as_ubyte(upscaled_image_bilateral))
# Save the upscaled image
output_path_bilateral = '/mnt/data/upscaled_bilateral_optimized_B1FDWY.bmp'
io.imsave(output_path_bilateral, img_as_ubyte(upscaled_image_bilateral))
psnr_value_bilateral
최종 결론
이중 양방향 필터를 적용한 후 에지 검출을 통해 에지와 비에지 영역에 각각 적합한 필터를 적용하는 방법이 PSNR 값을 최대화하는 데 가장 효과적이었습니다. 이 방법은 노이즈 제거와 에지 보존을 동시에 수행하여 고품질의 이미지를 생성할 수 있습니다.
'인공지능 > gpt 활용' 카테고리의 다른 글
gpt 활용 노이즈 제거 및 업스케일링 최종 (1) | 2024.05.16 |
---|---|
gpt4o 활용 업스케일링, 노이즈 제거방식 비교하기 (0) | 2024.05.16 |
인공지능,gpts 활용하여 일본 여행 친구 만들기! - 번역, 메뉴 추천, 여행지 추천 ! (2) | 2024.01.09 |
아직은 미약한 친구에요... (1) | 2023.11.21 |
주식 추천 gpts (0) | 2023.11.21 |