개발 꿀팁/PYTHON

파이썬 묘화 기법 (고화질 그림)

Jammie 2022. 12. 7. 14:54
반응형

1. 일반적인 다선도를 그립니다.
일반적인 스타일 좌표 이름 및 크기 조정 외에도 해결해야 할 몇 가지 특별하지만 필요한 문제가 있습니다.

1. 우리가 자주 보관하는 그림은 흰색이 많이 남도록 주의하여 이 문제를 해결합니다.

2.중국어가 깨집니다.

3. 이미지가 흐려져 선명도가 부족해도 해결합니다

import cv2
from pylab import * # 중국어 지원
mpl.rcParams['font.sans-serif'] = ['SimHei']

img2 = cv2.imread("img/fenge-1-1.jpg")
img4 = cv2.imread("img/fenge-1-1-0.06.jpg")
img5 = cv2.imread("img/fenge-1-1-0.02.jpg")
img6 = cv2.imread("img/fenge-1-1-0.1.jpg")


img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)
h1, s, img2 = cv2.split(img2) #싱글 채널 보기
img_array2 = np.array(img2) # 그림을 배열 형식으로 변환합니다. img = np.asarray(image)
mean2 = np.average (img_array2, axis=0) # 열을 기준으로 평균을 냅니다

img4 = cv2.cvtColor(img4, cv2.COLOR_BGR2HSV)
h1, s, img4 = cv2.split(img4) # 싱글 채널 보기입니다.
img_array4 = np.array(img4) # 그림을 배열 형식으로 변환합니다. img = np.asarray(image)
mean4 = np.average (img_array4, axis=0) # 열을 기준으로 평균을 냅니다

img5 = cv2.cvtColor(img5, cv2.COLOR_BGR2HSV)
h1, s, img5 = cv2.split(img5) # 단일 채널을 봅니다
img_array5 = np.array(img5) # 그림을 배열 형식으로 변환합니다. img = np.asarray(image)
mean5 = np.average(img_array5, axis=0) # 열을 기준으로 평균을 냅니다

img6 = cv2.cvtColor(img6, cv2.COLOR_BGR2HSV)
h1, s, img6 = cv2.split(img6) #싱글 채널 보기
img_array6 = np.array(img6) # 그림을 배열 형식으로 변환합니다. img = np.asarray(image)
mean6 = np.average(img_array6, axis=0) # 열을 기준으로 평균을 냅니다

# # plt.plot(mean2,c="g",label=u'a=std/(255*2)')
# # plt.plot(mean4,linestyle=":",c="r",label=u'a=0.06')
# # plt.plot(mean5,linestyle="-.",c="b",label=u'a=0.02')
# # plt.plot(mean6,linestyle="--",c="k",label=u'a=0.1')

plt.plot(mean2,linewidth=1,c="g",label=u'a=std/(255*2)')
plt.plot(mean4,linewidth=1,linestyle=":",c="r",label=u'a=0.06')
plt.plot(mean5,linewidth=1,linestyle="--",c="b",label=u'a=0.02')
plt.plot(mean6,linewidth=1,linestyle="-.",c="darkorange",label=u'a=0.1')


plt.legend (loc='upper right', prop={'family':'SimHei', 'size':9}) # 범례를 유효하게 합니다.
# plt.legend (loc='upper right', size=5) # 범례가 활성화되도록 합니다lower
plt.tick_params(direction='in') # 눈금이 안쪽을 향합니다.
plt.xlim ([0, 255]) # 가로 좌표 범위입니다.
plt.ylim ([100, 150]) # 가로 좌표 범위입니다.
plt.ylim ([100, 150]) # 가로 좌표 범위입니다.
# plt.grid (True) ## 격자점을 추가합니다.
plt.axis('tight') # 좌표축 적응 데이터량 axis 좌표축 설정
plt.xlabel("그림 1 너비/ (픽셀)", size=10) 입니다.
plt.ylabel("열의 평균 회색 값", size=10) 입니다.

# plt.title("a 값을 다르게 하는 L*(x,y)의 1차원 그래프") # 제목입니다.

#방법 1입니다.
# plt.rcParams['savefig.dpi'] = 800 #이미지 픽셀입니다.
# #
# # plt.rcParams['figure.dpi'] = 800 #해상도입니다.
# #
# # # # plt.axis ('off') 축으로 이동할 수 있습니다.
# # # plt.savefig('img/name-2.jpg')
# 방법 2입니다.
#저장된 그림의 선명도, 크기를 직접 설정할 수 있습니다.
# plt.set_size_inches(6, 6) # 그림을 저장할 크기를 설정합니다
plt.savefig('img/name-1.jpg', dpi=800,bbox_inches='tight')

#bbox_inches는 생성된 그림 주위의 공백을 좁힙니다
# plt.show() 이전에 plt.savefig() 를 호출하지 않으면 공백이 생깁니다.

plt.show()

cv2.waitKey(0)
cv2.destroyAllWindows()

2. 주의: 눈금 방향을 설정하는 또 다른 방법:

 

import matplotlib.pyplot as plt

plt.rcParams['xtick.direction'] = 'in' # x 주 눈금 방향을 안쪽으로 설정합니다.
plt.rcParams['ytick.direction'] = 'in' # y축의 눈금 방향을 안쪽으로 설정합니다.

plt.rcParams['xtick.direction'] = 'out' # x바퀴의 눈금 방향을 바깥쪽으로 설정합니다.
plt.rcParams['ytick.direction'] = 'out' # y축의 눈금 방향을 안팎으로 설정합니다.

plt.rcParams['xtick.direction'] = 'inout' #x바퀴의 눈금 방향을 가운데로 설정합니다.
plt.rcParams['ytick.direction'] = 'inout' # y축의 눈금 방향을 가운데로 설정합니다

3.컬러 스타일입니다

4. 3D 그림을 그리세요(쇼해 보세요)

import cv2
from pylab import * # 중국어 지원
mpl.rcParams['font.sans-serif'] = ['SimHei']
from IPython.core.pylabtools import figsize # import figsize

img = cv2.imread("img/1-2.jpg", 0)
# print(img.shape)#2003채널인지 싱글채널인지 확인할 수 있습니다
cv2.imshow('img',img)
height, width= img.shape[:2]
print(height, width)

img = cv2.resize(img, (height,width))

xx, yy = np.mgrid[0:img.shape[0], 0:img.shape[1]]

# # create the figure
fig = plt.figure()
ax = fig.gca(projection='3d')
# # ax.invert_yaxis()
ax.invert_xaxis()

ax.plot_surface(xx, yy, img,rstride=1, cstride=1, cmap=plt.cm.gray,linewidth=0) #plt.cm.jet
ax.set_zlabel("그림 그레이 값") 입니다.
ax.set_xlabel('그림 2 너비/(픽셀)')
ax.set_ylabel ('그림 2 높이/ (픽셀)')
ax.set_ylim(bottom=0) #y축은 0부터 시작합니다
ax.set_zlim(bottom=0) #z축은 0부터 시작합니다
# plt.xlabel("그림 1 너비/ (픽셀)", size=10) 입니다.
# plt.ylabel("그림 1 높이/ (픽셀)", size=10) 입니다.
# plt.tick_params(direction='in') # 눈금이 안쪽을 향합니다.
plt.rcParams['xtick.direction']='in'
# # plt.rcParams['ytick.direction']='in'
# figsize (8, 4) # figsize를 설정합니다
# plt.rcParams['savefig.dpi'] = 600 #이미지 픽셀입니다.

# plt.rcParams['figure.dpi'] = 600 #해상도입니다.
# # plt.savefig('img/3D-1-2.jpg')
#2. 저장된 이미지의 크기입니다.
fig.set_size_inches(6, 6) # 그림을 저장할 크기를 설정합니다
plt.savefig('img/3D-1-2.jpg', dpi=600,bbox_inches='tight')
#bbox_inches는 생성된 그림 주위의 공백을 좁힙니다
# plt.show() 이전에 plt.savefig() 를 호출하지 않으면 공백이 생깁니다.
plt.show()
cv2.waitKey()
cv2.destroyAllWindows()# 모든 창을 삭제합니다

3차원 좌표의 것과 2차원에는 여전히 차이가 있습니다

5.이중 y축 적용입니다.
핵심 코드:

# plt.xticks (x, x, rotation=45) # 가로 좌표 눈금 45도 회전합니다
plt.xticks([ ]) # 가로 좌표 눈금을 표시하지 않습니다
plt.xlim ([0.5, 4.5]) # 가로 좌표 범위입니다.
plt.ylim( [0, 1]) #좌표 범위입니다.


plt.xlabel (u" 원본 그림 MSRCR CALHE 알고리즘") # X축 레이블
plt.title("알고리즘에 따른 평가지표값의 변화") # 제목

# # plt.plot(greyScale_map, color='r')
plt.tick_params(direction='in') # 눈금이 안쪽을 향합니다.

# 다른 Y축을 그립니다
plt.twinx()
plt.plot(x, y1, marker='*', mec='g', mfc='w', ms=10, label=u' 정보 엔트로피 그래프')입니다.
plt.plot (x1, y4, marker='.', ms=10, label=u'PSNR 그래프')

 

반응형