OpenCV 및 Python을 사용한 이미지 처리에 대한 초보자 가이드

소스 노드 : 1074439

이 기사는 데이터 과학 Blogathon

개요

이미지 안에 숨겨진 많은 정보가 있을 수 있고 우리는 그것을 다양한 방식과 관점으로 해석할 수 있습니다. 그렇다면 이미지란 무엇이며 이미지를 처리하는 방법은 무엇입니까? 간단히 말해서 이미지는 무언가의 시각적 표현이며 컴퓨터 비전을 사용하여 쉽게 처리할 수 있다고 말할 수 있습니다(머신 러닝 관점에서). 동영상은 어떻습니까? 비디오는 일련의 움직이는 이미지 또는 연속 프레임의 기록으로 설명될 수 있습니다. 하지만 우리는 다른 블로그에서 컴퓨터 비전을 사용하여 비디오를 다룰 수 있습니다! 🙂

지금쯤이면 이미 Computer Vision에 대해 알고 계시는 분들도 계시고 이 단락은 건너뛸 수 있겠지만, 잘 모르시는 분들을 위해 Computer Vision은 주로 'CV'의 축약형으로 알려져 있으며, 의료, 자동차, 제조업, 농업 등 현대 시대의 거의 모든 영역에서 유용한 정보를 추출하는 인공지능

OpenCV로 이미지 처리 | 컴퓨터 시각 인식

이미지 1

현재 이 포스트를 읽고 있는 인간으로서 당신은 이미지에 존재하는 사물이나 요소를 구별할 수 있을 것입니다. 그러나 기계는 어떻습니까? 그들은 스스로 그것을 구별하기 위해 보고 생각할 수 있었습니까? 아니요? 그럼 당신의 기계가 그것을 하도록 합시다.

이 블로그에서는 파이썬을 사용하여 컴퓨터 비전의 기초에 익숙해질 것입니다.

Python으로 프로그래밍하기 위해 Python Shell/Jupyter Notebook/PyCharm 또는 Visual Studio Code(몇 가지 예)를 이미 설치했다고 생각합니다. 널리 사용되는 패키지(OpenCV)를 설치하여 시작하고 Jupyter Notebook의 각 셀에서 코드를 실행하겠습니다.

이미지 전처리를 위한 OpenCV 패키지 설치

OpenCV는 컴퓨터 비전, 기계 학습 및 이미지 처리 응용 프로그램에 널리 사용되는 사전 구축된 오픈 소스 CPU 전용 라이브러리(패키지)입니다. Python을 비롯한 다양한 프로그래밍 언어를 지원합니다.

다음을 사용하여 OpenCV 패키지를 설치합니다.

pip 설치 opencv-python

OR

pip는 opencv-contrib-python을 설치합니다.

터미널에서 이러한 명령 중 하나를 실행하거나 Anaconda Navigator – Jupyter Notebook을 사용하는 경우 "conda" 명령으로 "pip"를 변경하고 동일하게 설치할 수 있습니다.

패키지 가져오기

파이썬에서 패키지란? Python의 패키지는 미리 작성된 스크립트를 포함하는 모듈 모음입니다. 이 패키지는 모듈을 완전히 또는 개별적으로 가져오는 데 도움이 됩니다. 다음과 같이 "cv2" 모듈을 호출하여 패키지를 가져올 수 있습니다.

cv2 가져 오기

이미지 읽기

디지털 이미지는 다음과 같이 분류할 수 있습니다. 컬러 이미지, 그레이 스케일 이미지, 이진 이미지 및 다중 스펙트럼 이미지. 컬러 이미지는 각 픽셀에 대한 컬러 정보를 포함합니다. 유일한 색상으로 회색 음영이 있는 이미지는 회색조 이미지인 반면 이진 이미지는 정확히 두 가지 색상(대부분 흑백 픽셀)을 갖습니다. 다중 스펙트럼 이미지는 특정 파장 내에서 전자기 스펙트럼 범위의 이미지 데이터를 캡처하는 이미지입니다.

코딩 부분으로 돌아가서 이미지를 읽어 보겠습니다. 예를 들어 이미지는 아래와 같습니다.

읽기 이미지 | OpenCV를 사용한 이미지 처리

맨드릴의 이미지입니다. 현재 로컬 디렉토리에서 이미지를 읽고 있습니다.

# cv2.imread(path_to_image_with_file_extension, 플래그)

사용 코드는 다음과 같습니다.

img = cv2.imread("만드릴.jpg", 1)

여기에서 우리는 이미지를 읽기 위해 cv2 패키지의 "imread" 메소드를 사용하고 있으며 첫 번째 매개변수는 파일 이름과 확장자가 있는 이미지의 경로에 해당하고 두 번째 매개변수는 설정할 수 있는 플래그입니다. 이미지를 읽는 방법. 원하는 경우 여기에서 이미지의 절대 경로를 바꾸고 로컬 컴퓨터나 인터넷에서 읽어볼 수 있습니다! 이미지가 현재 작업 디렉토리에 있는 경우 확장 유형과 함께 이미지 이름만 지정하면 됩니다.

두 번째 매개변수와 관련하여 회색조 이미지로 읽으려면 매개변수를 0, -1로 지정하여 이미지를 변경하지 않은 것으로 읽을 수 있습니다(이미지가 있는 경우 알파 또는 투명 채널로 이미지를 읽음). 기본적으로 컬러 이미지로 1입니다. 이 링크에서 다른 매개변수를 시도할 수도 있습니다.

https://docs.opencv.org/4.5.2/d8/d6a/group__imgcodecs__flags.html#ga61d9b0126a3e57d9277ac48327799c80

ImreadModes에서.

이미지 속성

모양:

모든 이미지에는 모양이 있습니다. 그림에 나타난 경계의 길이는 모양, 즉 높이와 너비라고 할 수 있습니다. 이제 이미지 읽는 법을 알았으니 이미지의 모양을 확인해 볼까요?

인쇄(img.shape)

이미지의 모양을 인쇄하는 기본 방법이지만 다음을 사용하여 모양을 추출할 수 있습니다.

h, w, c = img.shape print("이미지 크기: nnHeight:", h, "pixelsnWidth:", w, "pixelsn채널 수:", c)

더 나은 이해를 얻기 위해.

색상 및 변경되지 않은 모드의 경우 높이, 너비 및 이미지에 있는 채널 수를 포함하여 3개의 값을 반환합니다. 회색조 모드를 사용한 경우 모양은 2가 되어 이미지의 높이와 너비를 반환하지만 h 및 w 변수만 사용해야 합니다( "c" 사용 제외). 그렇지 않으면 다음을 얻을 수 있습니다. "압축을 풀기에 값이 충분하지 않습니다(예상 3, 2가 있음)"라는 값 오류.

유형:

"type" 방법을 사용하여 이미지의 유형을 알 수 있습니다. 이 방법을 사용하면 이미지 데이터가 어떻게 표현되는지 알 수 있습니다. 다음과 같이 코드를 실행합니다.

인쇄(유형(이미지))

결과는 다음과 같을 수 있습니다.

이미지 유형으로. 동일한 유형 및 크기의 항목이 있는 다차원 컨테이너입니다. 다음 링크에서 N차원 배열에 대해 더 많이 참조할 수 있습니다.

https://numpy.org/doc/stable/reference/arrays.ndarray.html

방금 읽은 이미지의 데이터 유형:

이미지는 N차원 배열이므로 이미지의 데이터 유형을 확인할 수 있습니다.

인쇄(img.dtype)

이미지 픽셀 값:

우리는 이미지를 작은 샘플의 집합으로 생각할 수 있습니다. 이러한 샘플을 픽셀이라고 합니다. 이해를 돕기 위해 이미지를 최대한 확대해 보세요. 우리는 같은 것을 다른 사각형으로 나누는 것을 볼 수 있습니다. 이들은 픽셀이며 함께 결합되면 이미지를 형성합니다.

이미지를 표현하는 간단한 방법 중 하나는 행렬 형태입니다. 행렬을 사용하여 이미지를 만들고 저장할 수도 있습니다! 이 게시물의 뒷부분에서 방법을 보여줍니다. 아래의 이 사진을 보십시오.

이미지 픽셀 값 | OpenCV를 사용한 이미지 처리

이미지 2

이 그림은 오히려 이미지의 행렬 표현이 어떻게 보이는지 보여주는 예입니다. 왼쪽에는 링컨의 이미지가 있고 가운데에는 픽셀 값이 0에서 255까지의 숫자로 레이블되어 강도 또는 밝기를 나타내고 오른쪽에는 행렬 형태의 숫자가 표시됩니다. 행렬의 각 값은 이미지에 있는 정보의 가장 작은 요소인 픽셀에 해당합니다. 이미지를 로드한 변수를 인쇄하여 이미지 픽셀 값을 확인하십시오!

인쇄(이미지)

이미지 해상도 :

이미지 해상도는 이미지에 존재하는 픽셀 수로 정의할 수 있습니다. 픽셀 수가 증가하면 이미지 품질이 향상됩니다. 우리는 이전에 행과 열의 수를 나타내는 이미지의 모양을 보았습니다. 이것은 그 이미지의 해상도라고 할 수 있습니다. 표준 해상도 중 일부는 거의 모든 사람이 알고 있는 320 x 240픽셀(대부분 작은 화면 장치에 적합), 1024 x 768픽셀(표준 컴퓨터 모니터에서 보기에 적합), 720 x 576픽셀(표준 화질 TV에서 보기에 적합)입니다. 종횡비가 4:3인 세트), 1280 x 720픽셀(와이드스크린 모니터에서 보기용), 1280 x 1024픽셀(5:4 종횡비의 LCD 모니터에서 전체 화면 크기로 보기에 적합), 1920 x 1080픽셀 (HD TV에서 보기용) 이제 우리는 초고화질 모니터와 텔레비전에서 각각 지원하는 4 x 5 픽셀, 8 x 3840 픽셀 및 2160 x 5120 픽셀인 2880K, 7,680K 및 4,320K 해상도를 가지고 있습니다.

열 수와 행 수를 곱하면 이미지에 있는 총 픽셀 수를 얻을 수 있습니다. 예를 들어, 320 x 240 이미지에서 여기에 있는 총 픽셀 수는 76,800픽셀입니다.

이미지 보기

창에 이미지를 표시하는 방법을 살펴보겠습니다. 이를 위해 화면에 이미지를 표시할 GUI 창을 만들어야 합니다. 첫 번째 매개변수는 문자열 형식으로 지정된 GUI 창 화면의 제목이어야 합니다. cv2.imshow() 메서드를 사용하여 팝업 창에 이미지를 표시할 수 있습니다. 그러나 닫으려고 하면 창에 갇힌 느낌이 들 수 있습니다. 따라서 이를 방지하기 위해 간단한 "waitKey" 메서드를 사용할 수 있습니다. 새 셀에서 이 코드 부분을 사용해 보세요.

cv2.imshow('Mandrill', img) k = cv2.waitKey(0) if k == 27 또는 k == ord('q'): cv2.destroyAllWindows()

여기에서 "waitKey"에 매개변수 '0'을 지정하여 창을 닫을 때까지 창을 계속 열어 두었습니다. (0 대신에 시간을 밀리초 단위로 지정하여 열어야 하는 시간을 지정할 수도 있습니다.) 그런 다음 'ESC' 키 또는 ' 키를 누를 때 창을 닫는 역할을 하는 변수를 할당할 수 있습니다. NS'. cv2.destroAllWindows() 메서드는 화면/메모리에서 GUI 창을 닫거나 삭제하는 데 사용됩니다.

이미지 저장

이미지를 저장하기 전에 이미지를 회색조로 변환하여 저장하는 것은 어떻습니까? 다음을 사용하여 이미지를 회색조로 변환합니다.

회색 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

이제 이미지를 저장할 수 있습니다.

cv2.imwrite('Mandrill_grey.jpg', 회색)

현재 작업 디렉토리에 저장되고 있는 이미지를 확인합니다. 첫 번째 매개변수는 이미지가 저장될 파일의 ​​이름에 해당하고 두 번째 매개변수는 이미지(픽셀 정보)를 포함하는 변수입니다.

이미지 비트 평면 추출 및 재구성

이미지를 비트 평면의 다른 수준으로 나눌 수 있습니다. 예를 들어, 이미지를 8비트(0-7) 평면으로 나눕니다. 여기서 마지막 몇 평면에는 이미지에 대한 대부분의 정보가 포함됩니다.

비트 계획

이미지 3

이를 위해 두 개의 패키지를 더 가져올 수 있습니다.

matplotlib.pyplot을 plt로 가져오기 numpy를 np로 가져오기

패키지를 가져오는 동안 오류가 발생하면 다음을 사용하여 설치할 수 있습니다.

conda 설치 -c conda-forge matplotlib conda 설치 -c 아나콘다 numpy

이제 우리는 이미지의 8레벨 비트 평면을 각각 추출하는 함수를 정의하고 있습니다.

def extract_bit_plane(cd): # c1에서 c8까지의 변수 # 1에서 8까지 모든 비트를 하나씩 추출 c1 = np.mod(cd, 2) c2 = np.mod(np.floor(cd/2) , 2) c3 = np.mod(np.floor(cd/4), 2) c4 = np.mod(np.floor(cd/8), 2) c5 = np.mod(np.floor(cd/16) ), 2) c6 = np.mod(np.floor(cd/32), 2) c7 = np.mod(np.floor(cd/64), 2) c8 = np.mod(np.floor(cd/ 128), 2) # 원본 회색조 이미지와 동일한 형태로 이미지를 다시 결합 cc = 2 * (2 * (2 * c8 + c7) + c6) # 3개의 최상위 비트 평면으로 이미지 재구성 to_plot = [cd, c1, c2 , c3, c4, c5, c6, c7, c8, cc] 무화과, 축 = plt.subplots(nrows=2, ncols=5,figsize=(10, 8), subplot_kw={'xticks': [], ' yticks': []}) fig.subplots_adjust(hspace=0.05, wspace=0.05) ax용, i in zip(axes.flat, to_plot): ax.imshow(i, cmap='gray') plt.tight_layout() plt.show() cc 반환

이제 함수를 호출할 준비가 되었습니다.

재구성된_이미지 = 추출_비트_평면(회색)

마지막 세 개의 비트 평면, 즉 여섯 번째, 일곱 번째 및 여덟 번째 평면을 사용하여 이미지(거의 유사)를 재구성했습니다. 결과는 다음과 같습니다.

이미지를 재구성 | OpenCV를 사용한 이미지 처리

우리 스스로 작은 이미지를 만들어 보는 건 어떨까요? 지금 시도하자!

작은 합성 이미지 구성

XNUMX개의 다른 픽셀 강도 값을 가진 XNUMX개의 동심 정사각형을 포함하는 합성 이미지를 생성하려고 시도할 수 있습니다.

40, 80, 160 및 220.

con_img = np.zeros([256, 256]) con_img[0:32, :] = 40 # 위쪽 행 con_img[:, :32] = 40 #왼쪽 열 con_img[:, 224:256] = 40 # 오른쪽 열 con_img[224:, :] = 40 # 아래쪽 행 con_img[32:64, 32:224] = 80 # 위쪽 행 con_img[64:224, 32:64] = 80 # 왼쪽 열 con_img[64:224, 192: 224] = 80 # 오른쪽 열 con_img[192:224, 32:224] = 80 # 아래쪽 행 con_img[64:96, 64:192] = 160 # 위쪽 행 con_img[96:192, 64:96] = 160 # 왼쪽 열 con_img[96:192, 160:192] = 160 # 오른쪽 열 con_img[160:192, 64:192] = 160 # 아래쪽 열 con_img[96:160, 96:160] = 220 plt.imshow(con_img)

결과 이미지는 다음과 같습니다.

출력

다른 기사에서 이미지에 다양한 필터와 변형을 사용하는 방법을 살펴볼 수 있습니다.

기사를 읽어주셔서 감사합니다.

뮘

이미지 4

의견 아래에 제안 사항을 추가하고 이 기사가 마음에 들면 공유하십시오. 이 기사에서 언급한 Jupyter Notebook의 전체 Python 프로그래밍 코드는 내 Github 리포지토리에서 사용할 수 있습니다.

https://github.com/jissdeodates/Beginner-s-Guide-to-Computer-Vision

참조 :

  1. 이미지 1 – https://seevisionc.blogspot.com/2013/09/computer-vision-is-everywhere.html
  2. 이미지 2- https://towardsdatascience.com/everything-you-ever-wanted-to-know-about-computer-vision-heres-a-look-why-it-s-so-awesome-e8a58dfb641e
  3. Image 3- https://nptel.ac.in/content/storage2/courses/117104069/chapter_8/8_13.html
  4. 이미지 4- https://memegenerator.net/instance/21508026/willy-wonka-oh-so-you-created-a-computer-vision-algorithm-you-must-never-lose-the-remote

https://docs.opencv.org/4.5.2/d1/dfb/intro.html

https://docs.opencv.org/4.5.2/db/deb/tutorial_display_image.html

이 기사에 표시된 미디어는 Analytics Vidhya의 소유가 아니며 작성자의 재량에 따라 사용됩니다.

출처: https://www.analyticsvidhya.com/blog/2021/09/a-beginners-guide-to-image-processing-with-opencv-and-python/

타임 스탬프 :

더보기 분석 Vidhya