Python 의 기본 적 인 이미지 조작 과 처리 총화

1.Python 이미지 처리 PIL 라 이브 러 리
1.1 이미지 형식 변환

# PIL(Python Imaging Library)
from PIL import Image
plt.rcParams['font.sans-serif'] = ['SimHei']
#       ,cv.imread    array,Image.open()      RGB
pil_im=Image.open('pic/kobe_mamba.jpg')

subplot(121),plt.title('  '),axis('off')
imshow(pil_im)

pil_im_gray=pil_im.convert('L')
subplot(122),plt.title('   '),xticks(x,()),yticks(y,())
imshow(pil_im_gray)
在这里插入图片描述

#        PIL        。   1,L,P,RGB,RGBA,CMYK,YCbCr,I,F。
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
plt.rcParams['font.sans-serif'] = ['SimHei']

pil_im=Image.open('pic/apple.jpg')

#   1     

pil_im_binary=pil_im.convert('1')
subplot(231),plt.title('    '),axis('off'),imshow(pil_im_binary)

pil_im_binary.getpixel((10,10))

#   2 L = R * 299/1000 + G * 587/1000+ B * 114/1000      0   ,255   

#   3 P   8     ,  RGB  

pil_im_p=pil_im.convert('P')

subplot(232),plt.title('  P  '),axis('off'),imshow(pil_im_p)

#   4   “RGBA” 32     ,       32 bit  ,  24bit    、         ,  8bit(255)  alpha  ,255     。

pil_im_RGBA=pil_im.convert('RGBA')

subplot(233),plt.title('RGBA  '),axis('off'),imshow(pil_im_RGBA)

#   5 CMYK    +  ,     32   
# C = 255 - R, M = 255 - G, Y = 255 - B, K = 0

pil_im_CMYK=pil_im.convert('CMYK')

subplot(234),plt.title('CMYK  '),axis('off'),imshow(pil_im_CMYK)

#  6 YCbcr 24 bit   Y= 0.257*R+0.504*G+0.098*B+16 Cb = -0.148*R-0.291*G+0.439*B+128 Cr = 0.439*R-0.368*G-0.071*B+128

pil_im_YCbCr=pil_im.convert('YCbCr')

subplot(235),plt.title('YCbCr  '),axis('off'),imshow(pil_im_YCbCr)

#   7 I     L       ,    32bit

#   8 F          ,   L    
在这里插入图片描述
1.2 미리 보기 그림

# PIL(Python Imaging Library)
from PIL import Image
from pylab import *
plt.rcParams['font.sans-serif'] = ['SimHei']

pil_im=Image.open('pic/kobe_mamba.jpg')


#              

pil_im.thumbnail((120,120))

plt.title('   '),xticks(x,()),yticks([])
imshow(pil_im)
在这里插入图片描述
1.3 복사,붙 여 넣 기,회전,사이즈 조정

#        ( 、 、 、 ),         ,   [100:400,100:400]

box=(100,100,400,400)

region=pil_im.crop(box)
#   180 
region=region.transpose(Image.ROTATE_180)

figure(figsize=(5,5))

plt.title('    '),axis('off')


imshow(region)
#  


pil_im=Image.open('pic/kobe_mamba.jpg')

pil_im.paste(region,box)

figure(figsize=(5,5))

plt.title('      '),axis('off')

imshow(pil_im)

#         resize   rotate   

out=pil_im.resize((128,128))

out=pil_im.rotate(45)
在这里插入图片描述
두 번 째 그림 은 박스 가 180 도 회전 해서 붙 인 결과 입 니 다.
2.Matoplotlib 라 이브 러 리 기초 학습

#     
import numpy as np
import matplotlib.pyplot as plt
from numpy import pi
from pylab import *

x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
figure()
plt.plot(x,y)
figure()
plt.plot(x,z)
plt.show()
두 장의 제도
在这里插入图片描述

x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
plt.plot(x,y)
plt.plot(x,z)
제도 중첩
在这里插入图片描述

#     、  、  
plot(x, y, color="blue", linewidth=1.0, linestyle=":")
plot(x,z,'--r',linewidth=2.0)
在这里插入图片描述
在这里插入图片描述

#     
a=np.arange(13)*pi/12
b=cos(3*a)
plot(a,b,'bo',markersize=3)
在这里插入图片描述

#              
a=np.arange(13)*pi/12
b=cos(3*a)
plot(a,b,'--rs',markeredgecolor='y',markerfacecolor='w')
在这里插入图片描述

#            
x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
xlim(-4,4)
xticks(np.linspace(-4,4,10))
ylim(-1.0,1.0)
yticks(np.linspace(-1.0,1.0,5))
plt.plot(x,y,'--r')
在这里插入图片描述

#   title         
#     
matplotlib.rcParams['axes.unicode_minus'] =False
plt.rcParams['font.sans-serif'] = ['SimHei']
x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
figure()
plt.plot(x,y)
axis('off')

figure()
plt.plot(x,z)
plt.xticks([])

plt.show()

#   title         
#     
matplotlib.rcParams['axes.unicode_minus'] =False
plt.rcParams['font.sans-serif'] = ['SimHei']
x=np.linspace(-pi,pi,256)
y,z=np.cos(x),np.sin(x)
figure()
plt.plot(x,y)
axis('off')

figure()
plt.plot(x,z)
plt.xticks([])

plt.show()
在这里插入图片描述

#        (   )
# xticks(locs, [labels], **kwargs)  # Set locations and labels **kwargs      
import calendar

x = range(1,13,1)
y = range(1,13,1)
plt.plot(x,y)
#       ('','','',...)  
plt.xticks(x, calendar.month_name[1:13],color='m',rotation=45,fontsize=12,fontname='Arial')
plt.show()

在这里插入图片描述

#     
matplotlib.rcParams['axes.unicode_minus'] =False

plt.rcParams['font.sans-serif'] = ['SimHei']
a=np.arange(13)*pi/12
b=cos(3*a)
plt.plot(a,b,'--rs',markeredgecolor='y',markerfacecolor='w',label='cos   ')
xlabel('  ')
ylabel('  ')
plt.legend(loc='upper right')
plt.show()
在这里插入图片描述

#   1
matplotlib.rcParams['axes.unicode_minus'] =False

x=np.linspace(-pi,pi,10)
y,z=np.cos(x),np.sin(x)
fig, (ax1 ,ax2) = plt.subplots(nrows=1, ncols=2, figsize=(8, 4))
ax1.plot(x,y),ax2.plot(x,z)
ax1.set_title('cos'),ax2.set_title('sin')
plt.show()
在这里插入图片描述

#   2
matplotlib.rcParams['axes.unicode_minus'] =False

x=np.linspace(-pi,pi,10)
y,z=np.cos(x),np.sin(x)
figure(figsize=(10,5),dpi=80)
subplot(121),plt.plot(x,y),plt.title('cos')
subplot(122),plt.plot(x,z),plt.title('sin')
plt.show()
在这里插入图片描述
2.1 실제 그림 의 점 과 선 그리 기

#   matplotlib  
from PIL import Image
from pylab import *

#      ,    x、y  ?
im=array(Image.open('pic/kobe_mamba.jpg'))

imshow(im)

#           
x=[100,100,400,400]
y=[200,500,200,500]

#      
plot(x,y,'rx')


#             (100,200) (100,500)
plot(x[:2],y[:2])

show()
在这里插入图片描述
2.2 이미지 윤곽 과 직사 도

# contour   hist
#             
from PIL import Image
from pylab import *

im=array(Image.open('pic/kobe_mamba.jpg').convert('L'))
figure()
# 
gray()
#     ,           
contour(im,origin='image')

#        
axis('equal')

#    
figure()
hist(im.ravel(),256)

# hist              ,128 ,            2
figure()
hist(im.flatten(),128) 

show()
在这里插入图片描述
3.Numpy 라 이브 러 리 기본 학습

import numpy as np

import math
a=np.array(((1,2,3),(4,5,6)),dtype=float/complex)
a
在这里插入图片描述
在这里插入图片描述

b=np.arange(15).reshape(3,5)
b
#   
b.shape
b.ndim
b.dtype
b.size
b.itemsize
在这里插入图片描述

from numpy import pi
np.linspace( 0, 2, 9 )                 # 9 numbers from 0 to 2
array([ 0.  ,  0.25,  0.5 ,  0.75,  1.  ,  1.25,  1.5 ,  1.75,  2.  ])

c=np.random.random((2,3))

c.max/min()
在这里插入图片描述

d=np.arange(12).reshape((3,4))
d.dtype.name
#   col sum
print(d.sum(axis=0))
#       
print(d.cumsum(axis=1))
在这里插入图片描述

#       
a=np.array(((1,2,3),(4,5,6)),'float32')
a=a.astype('int16')
a
在这里插入图片描述

#      
a = np.arange(10)**3 # 0~9   
a[2:5] #a[2-4]
#  a[0,2,4] -1000
a[:6:2] = -1000 
# reverse
a[ : :-1] 
在这里插入图片描述

a = np.arange(12).reshape((3,4))
a[0:3,1]
#  2 
# or
a[:,1]
a[0:1,0:3]
在这里插入图片描述

#    1   
a = np.arange(12).reshape((3,4))
a.ravel()
在这里插入图片描述

#     
a = np.arange(12).reshape((3,4))
a.resize((6,2))
a
在这里插入图片描述

a = np.arange(12).reshape((3,4))
b=10*np.random.random((3,4))
#     
np.vstack((a,b))
#     
np.hstack((a,b))
在这里插入图片描述

x, y = np.ogrid[:3, :4]
#         
x, y = np.ogrid[0:3:1, 0:5:2]

#   ,x>0     ,     2
np.where(x>0,x,2)
在这里插入图片描述
3.1 직사 도 균형 화

#       
import numpy as np
a=[1,2,3,4,5,6,7]
cdf=np.cumsum(a)

cdf[-1]

cdf=7*cdf/cdf[-1]
cdf
28
在这里插入图片描述

#       
# bins       
def histeq(im,bins=256):
    #      
    imhist,bins=histogram(im.flatten(),bins)
    #       ,   cdf     
    cdf=imhist.cumsum()
    # cdf[-1]         ,(0,255)
    cdf=255*cdf/cdf[-1]
    #       
    im2=interp(im.flatten(),bins[:-1],cdf)
    #   im2     im  
    return im2.reshape(im.shape),cdf
#          
im=array(Image.open('pic/kobe_mamba.jpg').convert('L'))
im2,cdf=histeq(im,256)

figure()
imshow(im2)
figure()
hist(im2.flatten(),256)
show()
在这里插入图片描述
3.2 그림 크기 조정

#     array
img = np.asarray(image)

#    Image
Image.fromarray(np.uint8(img))

#       

def imresize(im,sz):
    #         
    pil_im=Image.fromarray(np.uint8(im))
    #        
    return np.array(pil_im.resize(sz))

imshow(imresize(Image.open('pic/kobe_mamba.jpg'),(128,128)))
在这里插入图片描述
3.3 이미지 의 주성 분 분석(PCA)
PCA(Principal Component Analysis,주성 분 분석)는 매우 유용 한 강 차원 기법 이다.이 는 가능 한 한 적은 차원 을 사용 하 는 전제 에서 훈련 데이터 의 정 보 를 최대한 많이 유지 할 수 있다 는 의미 에서 가장 좋 은 기술 이다.한 폭 의 100 이라도×100 픽 셀 의 작은 그 레이스 케 일 이미지 도 1000 차원 으로 1000 차원 공간의 한 점 으로 볼 수 있다.1 조 화소 의 그림 은 백만 차원 을 가지 고 있다.이미지 가 매우 높 은 차원 을 가지 기 때문에 많은 컴퓨터 시각 응용 에서 우 리 는 자주 강 차원 조작 을 사용한다.PCA 에서 발생 하 는 투영 행렬 은 원시 좌 표를 기 존의 좌표계 로 바 꾸 고 좌표계 의 각 좌 표 는 중요성 에 따라 점차 배열 하 는 것 으로 볼 수 있다.
그림 데 이 터 를 PCA 로 변환 하기 위해 서 는 그림 을 1 차원 벡터 로 변환 해 야 합 니 다.우 리 는 NumPy 라 이브 러 리 의 flatten()방법 으로 변환 할 수 있다.
평평 해진 이미 지 를 쌓 으 면 우 리 는 행렬 을 얻 을 수 있 고 행렬 의 한 줄 은 그림 을 표시 할 수 있다.주 방향 을 계산 하기 전에 모든 줄 이미 지 는 평균 이미지 에 따라 중심 화 되 었 다.우 리 는 보통 SVD(Singular Value Decomposition,기이 한 값 분해)방법 으로 주성 분 을 계산한다.그러나 행렬 의 차원 이 매우 클 때 SVD 의 계산 이 매우 느 리 기 때문에 이때 보통 SVD 분 해 를 사용 하지 않 는 다.

from PIL import Image
from numpy import *

def pca(X):
  """      :
      :  X ,            ,          
      :    (          )、     """

  #     
    num_data,dim = X.shape

  #      
    mean_X = X.mean(axis=0)
    X = X - mean_X

if dim>num_data:
  # PCA-       
  M = dot(X,X.T) #      
  e,EV = linalg.eigh(M) #         
  tmp = dot(X.T,EV).T #        
  V = tmp[::-1] #                 ,        
  S = sqrt(e)[::-1] #                ,        
  for i in range(V.shape[1]):
    V[:,i] /= S
else:
  # PCA-   SVD   
  U,S,V = linalg.svd(X)
  V = V[:num_data] #      nun_data        

#       、     
return V,S,mean_X
Scipy
4.1 이미지 모호

#     
# Scipy  
from PIL import Image
from numpy import *
from scipy.ndimage import filters

im=array(Image.open('pic/building.tif').convert('L'))
# filters.gaussian_filter         
im2=filters.gaussian_filter(im,9)
imshow(im2)
在这里插入图片描述

from PIL import Image
#     ,           
im=array(Image.open('pic/landmark500x500.jpg'))
im2=np.zeros((im.shape))
for i in arange(3):
    im2[:,:,i]=filters.gaussian_filter(im[:,:,i],2)
    
#    (0,255),  imshow     
im2=uint8(im2)
figure(figsize=(5,5),dpi=80)
imshow(im2)
axis('off')

在这里插入图片描述
4.2 이미지 가이드

from PIL import Image
from numpy import *
from scipy.ndimage import filters

# filters.sobel(src,0/1,dst),0  y       ,1  x       

figure()
im=array(Image.open('pic/building.tif'))
imshow(im)


imx=np.zeros(im.shape)

imy=np.zeros(im.shape)
filters.sobel(im,0,imy)
figure()
imx=uint8(imy)
imshow(imy)

figure()
filters.sobel(im,1,imx)
imy=uint8(imx)
imshow(imx)

figure()
mag=sqrt(imx**2+imy**2)
mag=uint8(mag)
imshow(mag)

show()
在这里插入图片描述
두 번 째/세 번 째 그림 은 sobel 연산 자가 x/y 방향 에 있 는 도체 이 고 네 번 째 그림 은 두 개의 도체 가 중첩 되 어 경사도 가 된다.
4.3 형태학 계수

#         
from scipy.ndimage import measurements,morphology

im=array(Image.open('pic/zhiwen.tif').convert('L'))
im2=np.zeros(im.shape)
im2=1*(im<128)

labels,nbr_objects=measurements.label(im2)

print(f"Number of objects is {nbr_objects}.")

labels=np.uint8(labels)
imshow(labels)

im_open=morphology.binary_opening(im2,ones((3,3)),1)
labels_open,nbr_objects_open=measurements.label(im_open)
print(f"Number of objects is {nbr_objects_open}.")

imshow(labels_open)
在这里插入图片描述
在这里插入图片描述
형태학 계 수 는 label()함 수 를 사용 하여 이미지 의 그 레이스 케 일 값 을 라벨 로 하고 그림 1 은 114 개의 물 체 를 찾 았 으 며 그림 2 는 조작 을 통 해 17 개의 물 체 를 찾 았 다.
파 이 썬 의 기본 적 인 이미지 조작 과 처리 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 파 이 썬 이미지 조작 과 처리 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기