OpenCV 확장
이 기사에서는 OpenCV의 이미지에서 주어진 객체의 경계에서 픽셀을 추가 및 제거하는 데 사용하는 침식 및 팽창과 같은 형태학적 변환 개념을 설명합니다.
OpenCV에서 침식 및 팽창을 사용하여 이미지에 형태 변환 적용
형태학적 변환은 이진 이미지에서 수행되는 이미지 기반 작업입니다. 두 개의 입력이 필요합니다. 하나는 원본 이미지이고 두 번째는 커널입니다.
커널은 작업의 특성을 결정합니다. 두 가지 기본 형태학적 연산자는 침식과 팽창이며, 열림 및 닫힘 등과 같은 변형도 있습니다.
예제를 사용하여 침식과 팽창을 이해합시다.
침식은 토양 침식과 같습니다. 전경 개체의 경계를 침식합니다. OpenCV 표준 관점에서 흰색 부분이 1번인 L
의 이미지를 고려하면 255번으로 취급될 수도 있습니다.
침식은 주어진 이미지의 객체 경계에서 픽셀을 제거합니다. 이미지에서 이 객체 L
의 경계를 제거한 후 침식을 적용한 후 얇아집니다.
커널은 기술적인 용어로 2D 컨볼루션에서와 같이 이미지를 통과합니다. 원본 이미지의 픽셀(1 또는 0)은 커널 아래의 모든 픽셀이 1인 경우에만 1로 간주됩니다. 그렇지 않으면 침식되거나 0이 되어 커널의 크기에 따라 경계가 삭제됩니다.
팽창은 침식의 반대입니다. 주어진 이미지에서 객체의 경계에 픽셀을 추가합니다. 이미지에서 L
또는 객체 L
의 경계가 팽창 후에 더 두꺼워지는 것을 볼 수 있습니다.
기술적으로 커널 아래에 있는 하나 이상의 픽셀이 1이면 픽셀 요소는 1이며 그 결과 이미지의 흰색 영역이나 전경 개체의 크기가 증가합니다.
따라서 노이즈를 제거하려는 이미지가 있는 경우 침식이 백색 잡음을 제거하지만 객체도 축소되기 때문에 먼저 침식 연산을 적용한 다음 팽창을 적용할 수 있습니다. 그래서 우리는 팽창을 작동하여 원본 이미지를 보존합니다. 또한 오브젝트의 깨진 부분을 결합하는 데 유용합니다.
형태학적 변형에는 열기 및 닫기와 같은 변형이 있습니다. 개방은 침식을 적용한 후 팽창을 적용하는 과정입니다. 닫기는 팽창과 침식을 적용하는 정반대입니다.
OpenCV를 사용하여 여러 작업을 구현해 보겠습니다. 필요한 라이브러리를 가져와야 합니다.
이 줄에서 imread()
함수를 사용하여 이미지를 읽고 이미지의 경로를 인수로 제공하고 imagedata_original
이라는 변수에 저장합니다.
imagedata_original = cv2.imread("input.png")
이 코드에서 numpy
ones()
함수를 사용하여 5x5
픽셀의 커널을 정의하고 커널의 데이터 유형은 부호 없는 int
입니다.
kernel = np.ones((5, 5), np.uint8)
erode()
함수를 사용하여 다음 줄에 침식을 적용합니다. 원본 이미지, 커널 및 반복과 같은 여러 인수가 필요합니다.
iterations
은 침식 프로세스를 실행하려는 횟수를 제안합니다. 이 숫자를 늘리면 침식 효과가 증가합니다.
erosion_op = cv2.erode(imagedata_original, kernel, iterations=1)
dilate()
함수를 사용하여 이미지 객체에 팽창을 적용합니다. 인수는 erode()
함수에 정의된 것과 유사합니다.
dilation_op = cv2.dilate(imagedata_original, kernel, iterations=1)
이제 morphologyEx()
함수를 사용하여 여는 작업을 적용합니다. 이 함수는 적용할 열기 작업을 의미하는 입력 이미지 MORPH_OPEN
과 위에서 정의한 커널과 같은 인수를 취합니다.
opening_op = cv2.morphologyEx(imagedata_original, cv2.MORPH_OPEN, kernel)
morphologyEx()
함수에 닫기 작업을 적용하라는 다음 지시를 내립니다.
closing_op = cv2.morphologyEx(imagedata_original, cv2.MORPH_CLOSE, kernel)
완전한 소스 코드:
import cv2
import numpy as np
import matplotlib.pyplot as plot
FIG = plot.figure(figsize=(6, 5))
imagedata_original = cv2.imread("input.png")
FIG.add_subplot(2, 3, 1)
plot.imshow(imagedata_original)
plot.axis("off")
plot.title("original imagge")
kernel = np.ones((5, 5), np.uint8)
erosion_op = cv2.erode(imagedata_original, kernel, iterations=1)
FIG.add_subplot(2, 3, 2)
plot.imshow(erosion_op)
plot.axis("off")
plot.title("Erossion operatiopn")
dilation_op = cv2.dilate(imagedata_original, kernel, iterations=1)
FIG.add_subplot(2, 3, 3)
plot.imshow(dilation_op)
plot.axis("off")
plot.title("Dilation operatiopn")
opening_op = cv2.morphologyEx(imagedata_original, cv2.MORPH_OPEN, kernel)
FIG.add_subplot(2, 3, 4)
plot.imshow(opening_op)
plot.axis("off")
plot.title("Opening operatiopn")
closing_op = cv2.morphologyEx(imagedata_original, cv2.MORPH_CLOSE, kernel)
FIG.add_subplot(2, 3, 5)
plot.imshow(closing_op)
plot.axis("off")
plot.title("Clossing operatiopn")
plot.tight_layout()
plot.show()
matplotlib
를 사용하여 이미지에서 다른 작업으로 다른 출력을 실행하고 살펴보겠습니다.
대부분의 사람들은 경계에서 픽셀을 제거할 때 침식된 이미지의 텍스트가 두껍게 나타나는 이유를 혼동할 수 있습니다. 확장된 이미지의 텍스트가 개체 경계에 픽셀을 추가할 때 가늘게 나타나는 이유.
이는 OpenCV가 이미지에서 검은색 텍스트를 개체로 취급하지 않고 흰색 부분을 개체 자체로 취급했기 때문입니다. 따라서 침식 연산을 적용하면 검은색 경계에서 흰색 픽셀이 제거되므로 검은색 텍스트 경계가 두꺼워집니다.
팽창 작업은 검정색 텍스트의 경계에 흰색 픽셀을 추가합니다. 그래서 검정색 텍스트가 가늘어집니다.
Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.
LinkedIn