Python 이미지 처리 1: 이미지 읽기, 표시 및 저장

이미지 읽기, 표시 및 저장

skimage는 이미지에 대한 입력 및 출력 작업을 수행하는 io 모듈을 제공합니다. 연습의 편의를 위해 직접 사용할 수 있는 샘플 이미지가 포함된 데이터 모듈도 제공됩니다.

스키이미지 가져오기 모듈을 사용할 수 있습니다.

from skimage import io

1. 외부에서 이미지를 읽어서 표시

읽을 파일의 경로를 나타내는 매개 변수와 함께 skimage.io.imread(fname) 함수를 사용합니다. 이미지를 표시하려면 표시할 arr 배열을 나타내는 매개 변수와 함께 skimage.io.imshow(arr) 함수를 사용합니다(읽은 이미지는 numpy 배열 형태로 계산됨). 예:

from skimage import io
img=io.imread('D:/lena.bmp')
io.imshow(img)

2. 프로그램은 이미지와 함께 제공됩니다

skimage 프로그램은 몇 가지 샘플 이미지와 함께 제공됩니다.외부에서 이미지를 읽고 싶지 않다면 다음 샘플 이미지를 직접 사용할 수 있습니다.

우주 비행사 우주 비행사 이미지
커피 커피 한 잔 이미지
카메라 사람 들고 카메라 이미지
동전 동전 이미지
달 달 이미지
바둑판 바둑판 이미지 말 말 이미지 페이지 책 페이지 이미지
첼시 새끼 고양이 이미지 hubble_deep_field 별이 빛나는 하늘 이미지 텍스트 텍스트 이미지 시계 시계 이미지




이러한 이미지를 표시하려면 매개변수 없이 다음 코드를 사용할 수 있습니다.

from skimage import io,data
img=data.coffee()
io.imshow(img)

이미지 이름은 함수 이름에 해당합니다.예를 들어 커피 이미지에 해당하는 함수 이름은 coffee()입니다.이 샘플 이미지는 skimage 설치 디렉토리 아래에 저장되며 경로 이름은 data_dir입니다.이 경로를 인쇄하여 확인할 수 있습니다. :

from skimage import data_dir
print(data_dir)

보여주다:
아아

즉, 이미지를 읽는 다음 두 줄의 코드는 동일한 효과를 가집니다.

from skimage import data_dir,data,io
img1=data.coffee() 
img2=io.imread(data_dir+'/coffee.png')  

3. 이미지 저장

io 모듈의 imsave(fname, arr) 함수를 사용하여 달성하십시오. 첫 번째 매개변수는 저장된 경로와 이름을 나타내고 두 번째 매개변수는 저장할 배열 변수를 나타냅니다. 예:

from skimage import io,data
img=data.chelsea()
io.imshow(img)
io.imsave('d:/cat.jpg',img)

이미지를 저장하면서 포맷을 변환해주는 역할도 합니다. 이미지 포맷이 png 포맷으로 읽어서 저장했을 때 이미지 포맷이 jpg 이미지라면 이미지를 jpg 이미지에서 png 이미지로 변환해서 저장합니다.

4. 이미지 정보

如果想知道图像信息,可以直接打印输出,代码如下:
from skimage import io,data
img=data.chelsea()
io.imshow(img)
print(type(img))  #显示类型
print(img.shape)  #显示尺寸
print(img.shape[0])  #图像宽度
print(img.shape[1])  #图像高度
print(img.shape[2])  #图像通道数
print(img.size)   #显示总像素个数
print(img.max())  #最大像素值
print(img.min())  #最小像素值
print(img.mean()) #像素平均值

5. 이미지 그리기

matplotlib는 전문 드로잉 라이브러리로, 여러 Figure 창을 설정하고, Figure의 제목을 설정하고, 좌표 눈금자를 숨기고, Subplot을 사용하여 Figure에 여러 이미지를 표시할 수도 있습니다. 일반적으로 다음과 같이 matplotlib 라이브러리를 가져올 수 있습니다.
import matplotlib.pyplot as plt
즉, 실제로 그림을 그리기 위해 matplotlib 패키지의 pyplot 모듈을 사용합니다. 사실, 우리는 이미 다음과 같은 이미지 그리기를 사용했습니다.

io.imshow(img)  

이 코드 라인의 핵심은 matplotlib 패키지를 사용하여 이미지를 그리고 그리기가 성공한 후 matplotlib 유형의 데이터를 반환하는 것입니다. 따라서 다음과 같이 쓸 수도 있습니다.

import matplotlib.pyplot as plt
plt.imshow(img)

imshow() 함수 형식은 다음과 같습니다.
matplotlib.pyplot.imshow(X, cmap=None)
X: 그릴 이미지 또는 배열입니다.
cmap: 색상 맵(colormap), 기본적으로 RGB(A) 색상 공간에 그려집니다.
다른 선택적 색상 맵은 다음과 같습니다.

색상 스펙트럼 설명하다
가을 빨강-주황-노랑
흑백, 엑스레이
시원한 시안-마젠타
구리 검은 구리
깃발 빨강-흰색-파랑-검정
회색 검정, 흰색
더운 검정-빨강-노랑-흰색
hsv HSV 색상 공간, 빨강-노랑-녹색-시안-파랑-마젠타-빨강
지옥 검정-빨강-노랑
제트기 파란색-청록색-노란색-빨간색
연한 덩어리 검정-빨강-흰색
분홍색 블랙-핑크-화이트
혈장 녹색-빨간색-노란색
프리즘 빨간색-노란색-녹색-파란색-보라색-…-녹색 모드
자홍색
여름 녹황색
비리디스 파란색-녹색-노란색
겨울 청록색

그레이, 제트 등이 다음과 같이 널리 사용됩니다.

plt.imshow(image,plt.cm.gray)
plt.imshow(img,cmap=plt.cm.jet)

창에 그림을 그린 후 AxesImage 객체를 반환합니다. 이 객체를 창에 표시하려면 show() 함수를 호출하여 표시할 수 있습니다.

from skimage import io,data
img=data.astronaut()
dst=io.imshow(img)
print(type(dst))
io.show()

이미지를 표시하기 위해 다음과 같이 작성할 수도 있습니다.

import matplotlib.pyplot as plt
from skimage import io,data
img=data.astronaut()
plt.imshow(img)
plt.show()

창을 만들고 하위 그래프를 나누는 방법:

1. figure 함수와 subplot 함수를 사용하여 각각 기본 창과 subplot을 만듭니다.

예: 우주비행사 이미지의 3개 채널을 동시에 분리하여 표시

from skimage import data
import matplotlib.pyplot as plt
img=data.astronaut()
plt.figure(num='astronaut',figsize=(8,8))  #创建一个名为astronaut的窗口,并设置大小 
plt.subplot(4,1,1)     #将窗口分为两行两列四个子图,则可显示四幅图像
plt.title('origin image')   #第一幅图像标题
plt.imshow(img)      #绘制第一幅图像

plt.subplot(4,1,2)     #第二个子图
plt.title('R channel')   #第二幅图像标题
plt.imshow(img[:,:,0],plt.cm.gray)      #绘制第二幅图像,且为灰度图
plt.axis('off')     #不显示坐标尺寸

plt.subplot(4,1,3)     #第三个子图
plt.title('G channel')   #第三幅图像标题
plt.imshow(img[:,:,1],plt.cm.gray)      #绘制第三幅图像,且为灰度图
plt.axis('off')     #不显示坐标尺寸

plt.subplot(4,1,4)     #第四个子图
plt.title('B channel')   #第四幅图像标题
plt.imshow(img[:,:,2],plt.cm.gray)      #绘制第四幅图像,且为灰度图
plt.axis('on')     #显示坐标尺寸

plt.show()   #显示窗口

이미지 그리기 과정에서 matplotlib.pyplot 모듈 아래의 figure() 함수를 사용하여 디스플레이 창을 생성합니다. 이 함수의 형식은 다음과 같습니다.

matplotlib.pyplot.figure(num=None, figsize=None, dpi=None, facecolor=None, edgecolor=None)

모든 매개변수는 선택적이며 기본값이 있으므로 매개변수 없이 이 함수를 호출할 수 있습니다.
숫자: 정수 또는 문자 유형. 정수로 설정하면 정수는 창의 일련 번호를 나타냅니다. 문자열로 설정된 경우 문자열은 창의 이름을 나타냅니다. 이 매개변수를 사용하여 창의 이름을 지정합니다. 두 창의 일련 번호 또는 이름이 동일한 경우 후자의 창이 전자를 덮습니다.

figsize: 창 크기를 설정합니다. 그것은 figsize=(8, 8) dpi와 같은 튜플 유형의 정수입니다.
창의 해상도를 나타내는 정수입니다.
facecolor: 창의 배경색.
edgecolor: 창의 테두리 색상입니다.
figure() 함수로 생성된 윈도우는 하나의 이미지만 표시할 수 있는데, 여러 개의 이미지를 표시하려면 윈도우를 여러 개의 하위 그림으로 분할하여 각각의 하위 그림에 다른 이미지를 표시해야 합니다. subplot() 함수를 사용하여 subplot을 나눌 수 있습니다. 함수 형식은
matplotlib.pyplot.subplot(nrows, ncols, plot_number)
nrows: subplot의 행 수입니다.
ncols: 서브플롯의 열 수입니다.
plot_number: 현재 서브플롯의 번호입니다.
좋다:

plt.subplot(2,2,1)#则表示将figure窗口划分成了2行2列共4个子图,当前为第1个子图。我们有时也可以用这种写法:
plt.subplot(221)#两种写法效果是一样的。
#每个子图的标题可用title()函数来设置,是否使用坐标尺可用axis()函数来设置,如:
plt.subplot(221)
plt.title("first subwindow")
plt.axis('off')   

2. 서브플롯을 사용하여 디스플레이 창을 만들고 서브그래프를 나눕니다.

하위 그래프를 나눌 수 있는 또 다른 쓰기 방법이 있습니다. 예를 들면 다음과 같습니다.

import matplotlib.pyplot as plt
from skimage import data,color

img = data.coffee()

fig, axes = plt.subplots(2, 2, figsize=(7, 6))
ax0, ax1, ax2, ax3 = axes.ravel()

ax0.imshow(img)
ax0.set_title('Origin image')

ax1.imshow(img[:, :, 0], cmap=plt.cm.gray)
ax1.set_title('R channel')

ax2.imshow(img[:, :, 1], cmap=plt.cm.gray)
ax2.set_title('G channel')

ax3.imshow(img[:, :, 2], cmap=plt.cm.gray)
ax3.set_title('B channel')

for ax in axes.ravel():
    ax.axis('off')

fig.tight_layout()  #自动调整subplot间的参数

subplots() 함수를 직접 사용하여 창을 만들고 분할합니다. 이전 subplot() 함수보다 s가 하나 더 있으며 이 함수의 형식은 다음과 같습니다.

matplotlib.pyplot.subplots(nrows=1, ncols=1)
nrows: 모든 서브플롯 행의 수, 기본값은 1입니다.
ncols: 모든 서브플롯의 열 수, 기본값은 1입니다.

창 그림과 모든 하위 그림을 포함하는 튜플 유형 ax 객체를 반환합니다. ravel() 함수와 결합하여 다음과 같은 모든 하위 그림을 나열할 수 있습니다.

fig, axes = plt.subplots(2, 2, figsize=(7, 6))
ax0, ax1, ax2, ax3 = axes.ravel()
# 创建了2行2列4个子图,分别取名为ax0,ax1,ax2和ax3, 每个子图的标题用set_title()函数来设置,如:
ax0.imshow(img)
ax0.set_title("Original image")
# 如果有多个子图,我们还可以使用tight_layout()函数来调整显示的布局,该函数格式为:
matplotlib.pyplot.tight_layout(pad=1.08, h_pad=None, w_pad=None, rect=None)
# 所有的参数都是可选的,调用该函数时可省略所有的参数。
pad: 主窗口边缘和子图边缘间的间距,默认为1.08
h_pad, w_pad: 子图边缘之间的间距,默认为 pad
rect: 一个矩形区域,如果设置这个值,则将所有的子图调整到这个矩形区域内。
# 一般调用为:
plt.tight_layout()  #自动调整subplot间的参数

요약하면 이미지를 그리고 표시하는 데 일반적으로 사용되는 기능은 다음과 같습니다.

함수 이름 기능 호출 형식
수치 디스플레이 창 만들기 plt.figure(num=1,figsize=(8,8)
imshow 이미지 그리기 plt.imshow(이미지)
보여주다 디스플레이 창 plt.show()
서브플롯 파티션 하위 그래프 plt.subplot(2,2,1)
제목 서브플롯 제목 설정(서브플롯과 함께 사용) plt.title('원본 이미지')
중심선 좌표 눈금자 표시 여부 plt.axis('끄기')
서브플롯 여러 서브플롯이 있는 창 만들기 fig,axes=plt.subplots(2,2,figsize=(8,8))
얽힘 각 서브플롯에 대한 변수 설정 ax0,ax1,ax2,ax3=axes.ravel()
set_title 서브플롯 제목 설정(축과 함께 사용) ax0.set_title('첫 번째 창')
타이트한 레이아웃 서브플롯 디스플레이 레이아웃 자동 조정 plt.tight_layout()

추천

출처blog.csdn.net/weixin_52051554/article/details/127358856