개발새발 로그

OPENCV와 K-MEANS CLUSTERING을 이용한 상 하의 색상 매칭-3 본문

파이썬

OPENCV와 K-MEANS CLUSTERING을 이용한 상 하의 색상 매칭-3

이즈흐 2021. 11. 8. 17:20

안녕하세요~

 

오늘은 본격적으로 톤온톤 톤인톤을 매칭 하는 프로그램을 만들어볼게요!

저는 어떤 프로그램을 만들때 다른 분들이 만든 것을 보고 공부하면서 배웁니다.

구글링을 엄청엄청 하는데

이거 나중에 많이 써먹습니다.. 다른 거 베끼면서 하는 것은 좋을 수도 있고 안 좋을 수도 있지만

그렇게 검색하면서 나중에는 검색스킬이 오르는 거니까요!

 

이 코드는 인터넷에서 보고 제가 제 입맛대로 고친 코드인데요

많이 야매스러운(?) 부분이 없지않아 있을 거예요!

하지만 감수하고 봐주세요...!

 


코드가 조금 긴 관계로 존재하는 많은 함수들은 일단 제쳐두고!

 

실행되는 부분만 먼저 설명할게요

그만큼 함수 부분이 많이 중요해서 더 자세하게 적으면서 공부하면 좋을 거 같다고 생각됩니다!

 

import numpy as np
import cv2
import matplotlib.image as mpimg
from matplotlib import pyplot as plt
from scipy.sparse import base
from sklearn.cluster import KMeans
import re
import colorsys

#----함수부분 생략-----

#-----------------------------체크하는 의류(상의)--------------------------------------

chkimg = "img/up1.jpg"

image = mpimg.imread(chkimg)
plt.imshow(image)
maxcolor1=image_color_cluster(chkimg,True) #TRUE는 해당 bar를 보여주게끔한다.밑에서는 생략하려고 함
print("체크하는 의류 BRG Format: ",maxcolor1)
colorsB1 =maxcolor1[2]
colorsG1 = maxcolor1[1]
colorsR1 = maxcolor1[0]
a1=convert_rgb_to_hsv(colorsR1,colorsG1,colorsB1)
up_color=maxcolor1
print("저장되는 의류 HSV Format" ,a1)



#-----------------------------저장하는 의류(하의)--------------------------------------
img_paths = {
    '검정슬랙스': 'img/down1.jpg',
    '라이트그레이슬랙스': 'img/down2.jpg',
    '카키슬랙스': 'img/down3.jpg',
    '연청바지': 'img/down4.jpg',
    '진청바지': 'img/down5.jpg',
    '생지데님바지': 'img/down6.jpg',
    '데미지청바지': 'img/down7.jpg',
}

 ##npy파일 만들기

descs = {
    '검정슬랙스': None,
    '라이트그레이슬랙스': None,
    '카키슬랙스': None,
    '연청바지': None,
    '진청바지': None,
    '생지데님바지': None,
    '데미지청바지': None,
 }


for name, img_paths in img_paths.items():
    #image = mpimg.imread(img_paths) 만약 저장되는 의류가 보고싶을 떄 삽입코드
    #plt.imshow(image)
    maxcolor=image_color_cluster(img_paths,False)
    down_color=maxcolor
    
    colorsB =maxcolor[2]
    colorsG = maxcolor[1]
    colorsR = maxcolor[0]
    a=convert_rgb_to_hsv(colorsR,colorsG,colorsB)
    
    print("저장되는 의류 :",name)
    print("저장되는 의류 RGB Format: ", maxcolor)
    print("저장되는 의류 HSV Format" ,a)
    
    check_up_down (up_color,a,chkimg,img_paths)

    descs[name] = a
    #각사람의 이름에 맞게 인코딩결과를 저장

np.save('img/descs.npy', descs)
print(descs)

 

이 프로그램은 '어떤 한 개의 상의가 있으면' '내가 가지고 있는 다수의 하의 색상'과 '톤온톤' 또는 '톤인톤'이 맞는지

확인하는 방식으로 되어 있습니다!

 

길게 보이지만 정말 별거 없습니다!

함수 부분을 제외한 실행 부분인데요

먼저 함수는

k-means clustering을 위한 image_color_cluster() 함수와

RGB 값을 HSV로 변환하기 위한 convert_rgb_to_hsv() 함수,

그리고 HSV값을 이용해 톤온톤과 톤인톤을 판단하는 check_up_down() 함수로 구성되어 있습니다.

 

이 내용들은 후에 알아보기로 하고요!

 

위의 코드 한번 샅샅이 공부해볼게요!

 

 

chkimg = "img/up1.jpg"
image = mpimg.imread(chkimg)
plt.imshow(image)

자 먼저 첫 부분!

 

정말 간단히 보면!

1. 이미지 저장하고

2. 읽어와서

3. 보여준다!

가 끝입니다.

 

한번 자세히 봐볼까요?

 

1.

chkimg에 상대 경로로 된 이미지를 저장하는 건데요!

파이썬 파일이 있는 곳에 해당 폴더가 있어야 합니다!

2. 

imread는 전 포스팅에서 배웠죠??

근데 mpimg는 뭐지..? 하실 거예요!

위에 import 부분을 보면

import matplotlib.image as mpimg

이런 부분이 있습니다!

바로 matplotlib로 이미지를 띄우기 위해선데요

3. 

이 부분에서 plot.imshow()를 하게 된다면 

그래프로 표현된 이미지

 

이런 그래프 형식으로 불러오게 됩니다!

이 형식은 이미지에 마우스를 올리면 우측 하단에 해당 좌표와 RGB 값을 알 수 있습니다!

마우스를 올렸을 때

 

 

up_color=image_color_cluster(chkimg,True) #TRUE는 해당 bar를 보여주게끔한다.밑에서는 생략하려고 함
print("체크하는 의류 BRG Format: ",up_color)
colorsB1 =up_color[2]
colorsG1 = up_color[1]
colorsR1 = up_color[0]
up_hsv_color=convert_rgb_to_hsv(colorsR1,colorsG1,colorsB1)
print("저장되는 의류 HSV Format" ,up_hsv_color)

두 번째 코드 단락입니다.

보시게 되면 변수의 용도는 뭔지 왜 있는지 궁금하실 거예요!

설명을 해드리면 

 

up_color : k-menas clustering을 통해 가져온 해당 옷 색상의 주된 색상값

colorsB1, G1, R1 : 상의 RGB 값

up_hsv_color : convert_rgb_to_hsv() 함수로 가져온 hsv값

 

이렇게 구성시켜봤는데요!

사실 함수 부분을 안 보여드려서 답답해하실 수 있는데

그렇게 중요한 부분은 아니니 해당 변수의 설명으로 이해해주시면 감사하겠습니다!

 

보시면 RGB 값을 따로 저장하는 부분이 있습니다

저게 어떻게 된 것이냐면 

clustering을 통해 가장 주된 색상값을 retruen 하여 (?,?,?) 값을 갖고 와서

후에 다시 convert_rgb_to_hsv를 하기 위해 가져온 값입니다.

 

간단하게 설명하면

"상의의 가장 주된 색상의 RGB 값을 가져오고 HSV값으로 가져와 보기 쉽게 출력한다."

입니다.

 

 

 

img_paths = {
    '검정슬랙스': 'img/down1.jpg',
    '라이트그레이슬랙스': 'img/down2.jpg',
    '카키슬랙스': 'img/down3.jpg',
    '연청바지': 'img/down4.jpg',
    '진청바지': 'img/down5.jpg',
    '생지데님바지': 'img/down6.jpg',
    '데미지청바지': 'img/down7.jpg',
}

 ##npy파일 만들기

descs = {
    '검정슬랙스': None,
    '라이트그레이슬랙스': None,
    '카키슬랙스': None,
    '연청바지': None,
    '진청바지': None,
    '생지데님바지': None,
    '데미지청바지': None,
 }

이 부분은 다수의 하의 이미지를 npy 파일을 만들기 위한 단락입니다!

img_paths와 descs는 딕셔너리 자료형으로 구성되어있습니다.

딕셔너리 자료형은 대응 관계를 나타낼 수 있는 자료형으로 설명 가능합니다!

 

이 파일을 저장하고 불러오는 것을 할 건데요!

for name, img_paths in img_paths.items():
    #image = mpimg.imread(img_paths) 만약 저장되는 의류가 보고싶을 떄 삽입코드
    #plt.imshow(image)
    down_color=image_color_cluster(img_paths,False)
   
    
    colorsB =down_color[2]
    colorsG = down_color[1]
    colorsR = down_color[0]
    down_hsv_color=convert_rgb_to_hsv(colorsR,colorsG,colorsB)
    
    print("저장되는 의류 :",name)
    print("저장되는 의류 RGB Format: ", down_color)
    print("저장되는 의류 HSV Format" ,down_hsv_color)
    
    check_up_down (up_hsv_color,down_hsv_color,chkimg,img_paths)

    descs[name] = down_hsv_color
    #각사람의 이름에 맞게 인코딩결과를 저장

np.save('img/descs.npy', descs)
print(descs)

이 부분은 상의의 색상을 체크하는 부분과 비슷하게 되어 있습니다!

 

이 반복문은 딕셔너리형으로 된 img_paths을 기준으로 반복되는데요!

for name, img_paths in img_paths.items():
  • 여기서 name은 img_paths의 첫 번째 부분, 즉 의류의 이름을 나타냅니다!                                                    '이름' : '이미지 경로'로 구성되어있으니까 그 앞에 이름 부분을 뜻하는 것입니다.
  • 두 번째 img_paths는 당연히 그 뒤에 부분을 뜻하는 것이겠죠?
  • img_paths.items()는 img_paths의 크기만큼만 반복한다는 것입니다.

 

그다음 부분은 위의 상의 부분이랑 똑같으니까 생략하고~

 

이 부분을 한번 볼까요?

descs[name] = down_hsv_color
    #각사람의 이름에 맞게 인코딩결과를 저장

np.save('img/descs.npy', descs)
print(descs)
  • descs [name]= down_hsv_color : 우리가 위에서 만들었던 npy파일을 만들기 위한 descs에 name에 따라 hsv값을 넣는 것입니다.
  • np.save('img/descs.npy', descs) : np명령어입니다! numpy를 저장하기 위한 명령어예요.
  • print(descs) : 저장한 npy파일을 출력합니다

여기서 궁금한 점은 바로 npy 파일이겠죠?

쉽게 말하자면 어떤 데이터를 이진화해서 파일 형식으로 저장해놓고, 나중에 사용해야 할 때 다시 불러와서 사용할 수 있다는 것입니다. 

그러면 나중에 사용할 때는 직접 변수 선언하고 저장하고 불러오는 게 아닌 불러오기만 하면 되겠죠?

 


이렇게 해서 실행 부분만 보여드렸는데요

 

아직 이해 안 되는 부분이 있을 거라고 생각됩니다.

함수 부분이 중요한 포인트이기 때문에 따로 포스팅하기로 결정했는데 

이 실행 부분은 그래도 쉬운 부분이니까 

정말 간단하게 보고 이해하셨으면 좋겠습니다.

 

그럼 다음 포스팅에서 봐요~~

728x90
반응형
LIST