OpenCV 없이 이미지 처리 | 파이썬

| | | | | | | | | | | | | | | | | |

OpenCV가 이미지 작업에 널리 사용되며 이를 위한 다양한 기능이 있다는 것을 알고 있습니다. 하지만 OpenCV와 같은 외부 라이브러리를 사용하지 않고 이미지 파일을 처리하려면 어떻게 해야 할까요? 어떻게 하는지 봅시다.

이미지 스케일링(최근접이웃 보간 사용):

최근접이웃 보간 — 이것은 보간하는 가장 쉬운 방법입니다. 이 방법은 단순히 "가장 가까운" 인접 픽셀을 결정하고 강도 값을 취합니다.

너비가 w이고 높이가 — p > m 및 q > N. 이제 두 개의 크기 조정 상수가 필요합니다.

scale_x = p / w scale_y = q / h 

이제 원래 픽셀을 참조하여 출력 이미지의 모든 픽셀을 반복하기만 하면 됩니다. 에서 복사 중입니다. scale_xscale_y를 사용하여 제어 변수의 크기를 조정하고 크기가 조정된 결과 인덱스 값을 반올림합니다.

시각적 표현:
이미지는 3X3 픽셀(총 9픽셀)입니다. 이제 이미지 크기를 6X6으로 늘리려면 가장 가까운 이웃 알고리즘에 따라 6/3(즉, 2) 픽셀은 값 픽셀과 동일한 RGB 값을 가져야 합니다. 원본 이미지로.

이미지 스케일링 프로그램:


< /tbody>

# matplotlib 및 numpy 사용

가져오기 matplotlib.image를 img로

가져오기 <코드 클래스 = "plain"> numpy as npy


# 읽을 수 있는 이미지 위치 제공

m <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> img.imread ( <코드 클래스 = "문자열"> "taj.png " <코드 클래스 = "일반">);


# 원본 이미지의 길이 정의

w , h <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> m.shape [: <코드 클래스 = "값"> 2 < 코드 클래스 = "일반">];


# xNew와 yNew는 새로운 너비이고
# 이미지 높이가 필요합니다.
크기 조정 후

xNew = <코드 클래스 = "함수"> int <코드 클래스 = "일반"> (w <코드 클래스 = "키워드"> * <코드 클래스 = "값 "> 1 <코드 클래스 = "키워드"> / <코드 클래스 = "값"> 2 <코드 클래스 = "일반">);

yNew = int <코드 클래스 = "일반"> (h <코드 클래스 = "키워드"> * <코드 클래스 = "값"> 1 <코드 클래스 = "키워드"> / < /코드> <코드 클래스 = "값"> 2 <코드 클래스 = "일반">);


# 배율 계산
# 2픽셀 이상 작동 code>

xScale = xNew / <코드 클래스 = "일반"> (w <코드 클래스 = "키워드"> - <코드 클래스 = "값"> 1 <코드 클래스 = "일반">);

yScale = yNew <코드 클래스 = "키워드"> / <코드 클래스 = "일반"> (h <코드 클래스 = "키워드"> - <코드 클래스 = "값"> 1 < /코드> <코드 클래스 = "일반">);


# numpy를 사용하여 xNew 행렬 사용
# 너비와 높이
# 4 속성 [alpha, B, G, B] 값 ‚Äã‚Äã

newImage <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> npy.zeros ([xNew, yNew, <코드 클래스 = "값"> 4 <코드 클래스 = "일반">]);


for i in 범위 (xNew - 1 ):

j 범위 (yNew - <코드 클래스 = "값"> 1 <코드 클래스 = "일반">):

<코드 클래스 = "일반"> newImage [ i <코드 클래스 = "키워드"> + <코드 클래스 = "값"> 1 <코드 클래스 = "일반">, j <코드 클래스 = " 키워드"> + <코드 클래스 = "값"> 1 <코드 클래스 = "일반">] <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> m [ <코드 클래스 = "값"> 1 <코드 클래스 = "키워드"> + <코드 클래스 = "기능 tions"> int (i / xScale),

<코드 클래스 = "값"> 1 <코드 클래스 = "키워드"> + <코드 클래스 = "함수"> int <코드 클래스 = "일반"> (j <코드 클래스 = "키워드"> / <코드 클래스 = "일반"> yScale)]


<코드 class = "comments"> # 크기 조정 후 이미지 저장

img.imsave ( `scaled.png ` <코드 클래스 ="일반 ">, newImage);

출력:

이미지 그레이스케일:

평균 사용 value 방법에서 이 방법은 RGB 값이 무엇으로 구성되어 있는지 보여주기 보다는 픽셀의 강도를 강조합니다. 평균 RGB 값을 계산하여 픽셀에 대한 RGB 값을 할당하면 픽셀의 RGB 값이 동일하므로 RGB 비율이 다르기 때문에 모든 색상이 생성되므로 어떤 색상도 생성할 수 없습니다. 값, 이 경우 비율은 1:1:1이 됩니다. 따라서 렌더링된 이미지는 회색 이미지처럼 보입니다.

시각적 표현:

회색조 이미지 프로그램:


# NumPy 사용

가져오기 numpy as npy


# matplotlib 사용

가져오기 matplotlib.image를 img로


# 통계를 사용하여 평균 가져오기
# 평균 계산

통계 가져오기 평균


<코드 클래스 = "일반"> m <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> img.imread ( <코드 클래스 = "문자열 "> "taj.png" )


# 너비와 높이 정의 원본 이미지

w, h = m .shape [: <코드 클래스 = "값"> 2 <코드 클래스 = "일반">]


<코드 클래스 = "설명 "> # 픽셀당 4개의 속성이 있는 새 이미지 크기

newImage = npy.zeros ([w, h, <코드 클래스 = "값"> 4 <코드 클래스 = "일반">])

인쇄 (w)

인쇄 (h)


i 범위 (w):

for j 범위 (h):

# RGB 비율은 0과 1 사이입니다.

<코드 클래스 = "일반"> lst <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> [ <코드 클래스 = "기능"> float <코드 클래스 = "일반"> (m [i] [j] [ <코드 클래스 = "값"> 0 <코드 클래스 = "일반">]), float (m [i] [j] [ 1 ]), float (m [i] [j] [ <코드 클래스 = "값 "> 2 <코드 클래스 ="일반 ">])]

<코드 클 ass ="plain " > avg = float (평균(최종) )

<코드 클래스 = "일반"> newImage [i] [j] [ <코드 클래스 = "값"> 0 <코드 클래스 = " 일반">] <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> 평균

<코드 클래스 = "일반"> newImage [i] [j] [ 1 ] = <코드 클래스 = "일반"> 평균

<코드 클래스 = "정의되지 않은 공백"> <코드 클래스 = "일반"> newImage [i] [j] [< /코드> <코드 클래스 = "값"> 2 <코드 클래스 = "일반">] <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> 평균

<코드 클래스 = "일반" > newImage [i] [j] [ <코드 클래스 = "값"> 3 <코드 클래스 = " plain">] = 1 # 알파 값은 다음과 같아야 합니다. 1


# imsave로 이미지 저장

img.imsave ( `grayedImage.png` , newImage)

출력:

이미지 자르기:

자르기는 기본적으로 제거 원치 않는 픽셀입니다. 필요한 픽셀을 다른 이미지 그리드에 배치하여 수행할 수 있습니다. 이미지의 크기는 자르기 후 필요한 크기와 일치합니다.

10 √ó 10픽셀 크기의 이미지를 고려하고 다음과 같은 경우 4 √ó 4 픽셀 크기의 이미지 중심만 자르고 싶다면 (10-4) / 2에서 (3, 3)에서 시작하여 최대 4픽셀의 픽셀 값을 수집해야 합니다. x 방향y 방향으로 4픽셀

시각적 표현:

이미지 자르기:


# matplotlib 및 numpy 사용

import matplotlib.image를 img로

가져오기 numpy를 npy로


# 변수 m의 이미지 읽기

m = <코드 클래스 = "일반"> img.imread ( <코드 클래스 = "문자열"> "taj.png" <코드 클래스 = "일반">)


# 이미지 크기 정의 너비(w) 높이(h)

w, h <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> m.shape [: <코드 클래스 = "값"> 2 <코드 클래스 = "일반">]


<코드 클래스 = "주석"> # 자르기 후 필요한 이미지 크기

xNew = int <코드 클래스 = "일반"> (w <코드 클래스 = "키워드"> * <코드 클래스 = "값"> 1 <코드 클래스 = "keyword"> / <코드 클래스 = "값"> 4 <코드 클래스 = "일반">)

<코드 클래스 = "일반" > yNew <코드 클래스 = "키워드"> = <코드 클래스 = "함수"> int <코드 클래스 = "일반"> (h <코드 클래스 = "키워드"> * <코드 클래스 = "값"> 1 <코드 클래스 = "키워드"> / <코드 클래스 = "값"> 4 <코드 클래스 = "일반">)

<코드 클래스 = "일반"> newImage <코드 클래스 = "키워드"> = <코드 클래스 = "일반 "> npy.zeros ([xNew, yNew, 4 ])


# 인쇄 너비 소스 이미지 높이

인쇄 <코드 클래스 ="일반 "> (w)

<코드 클래스 = "키워드"> 인쇄 <코드 클래스 = "일반" > (h)


for i 범위 ( 1 , xNew):

j 범위 ( 1 , yNew):

# 원본 이미지의 100에서 100픽셀로 자르기

<코드 클래스 = "일반"> newImage [i, j] <코드 클래스 = "키워드"> = <코드 클래스 = "일반"> m [< /코드> <코드 클래스 = "값" > 100 <코드 클래스 = "키워드"> + <코드 클래스 = "일반"> i, <코드 클래스 = "값" > 100 <코드 클래스 = "키워드"> + <코드 클래스 = "일반"> j]


<코드 클래스 = "주석" > # 이미지 저장

img.imsave ( `cropped.png` < 코드 클래스 = "일반">, newImage)

출력: