IT

저장된 이미지 주위의 공백 제거

itgroup 2022. 10. 19. 22:10
반응형

저장된 이미지 주위의 공백 제거

사진을 찍어서 저장해야 해요.그림을 표시했을 때는 정상으로 보이지만, 그림을 저장하면 이미지 주위에 공백이 생겼습니다.나는 그 일을 시도했다.'tight'에 대한 선택권.savefig메서드도 작동하지 않았습니다.코드:

  import matplotlib.image as mpimg
  import matplotlib.pyplot as plt

  fig = plt.figure(1)
  img = mpimg.imread("image.jpg")
  plt.imshow(img)
  ax = fig.add_subplot(1, 1, 1)

  extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
  plt.savefig('1.png', bbox_inches=extent)

  plt.axis('off') 
  plt.show()

Network X를 그림 위에 사용하여 기본 그래프를 그려서 저장하려고 합니다.그래프가 없으면 동작하지만 그래프를 추가하면 저장된 이미지 주위에 공백이 생깁니다.

import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import networkx as nx

G = nx.Graph()
G.add_node(1)
G.add_node(2)
G.add_node(3)
G.add_edge(1, 3)
G.add_edge(1, 2)
pos = {1:[100, 120], 2:[200, 300], 3:[50, 75]}

fig = plt.figure(1)
img = mpimg.imread("image.jpg")
plt.imshow(img)
ax = fig.add_subplot(1, 1, 1)

nx.draw(G, pos=pos)

extent = ax.get_window_extent().transformed(fig.dpi_scale_trans.inverted())
plt.savefig('1.png', bbox_inches=extent)

plt.axis('off') 
plt.show()

설정별로 빈 공간 채우기를 제거할 수 있습니다.bbox_inches="tight"savefig:

plt.savefig("test.png",bbox_inches='tight')

당신은 의론을 제기해야 할 것이다.bbox_inches그래서 더 일찍 효과가 없었던 것 같아요.


중복 가능성:

Matplotlib 그림: 축, 범례 및 공백 제거

matplotlib 그림의 여백을 설정하려면 어떻게 해야 합니다.

matplotlib 그림에서 왼쪽 및 오른쪽 여백 감소

"솔루션"이 왜 또는 어떻게 기능하는지 정확히 알고 있다고는 할 수 없지만, 몇 개의 에어로 오일 섹션의 윤곽을 흰색 여백 없이 PDF 파일로 표시하려고 할 때 이 작업을 수행해야 했습니다(IPython 노트북에서 -pylab 플래그를 사용하여 matplotlib를 사용했습니다).

plt.gca().set_axis_off()
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
            hspace = 0, wspace = 0)
plt.margins(0,0)
plt.gca().xaxis.set_major_locator(plt.NullLocator())
plt.gca().yaxis.set_major_locator(plt.NullLocator())
plt.savefig("filename.pdf", bbox_inches = 'tight',
    pad_inches = 0)

다른 부분을 비활성화하려고 했지만 항상 어딘가에 흰 마진이 생깁니다.이 값을 수정하여 수치 한계 부근의 뚱뚱한 선이 여백 부족으로 인해 깎이지 않도록 할 수도 있습니다.

위의 답변(및 많은 다른 스택 포스트)을 시도했지만 성공하지 못한 후, 결국 제게 효과가 있었던 것은

plt.gca().set_axis_off()
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
            hspace = 0, wspace = 0)
plt.margins(0,0)
plt.savefig("myfig.pdf")

중요한 것은 여기에는 bbox 인수나 padding 인수는 포함되지 않습니다.

Arvind Pereira(http://robotics.usc.edu/~amperir/wordpress/?p=626)에서 뭔가 발견했고, 나에게 맞는 것 같았다.

plt.savefig(filename, transparent = True, bbox_inches = 'tight', pad_inches = 0)

다음 기능에는 위의 요하네스 답변이 포함되어 있습니다.로 테스트했습니다.plt.figure그리고.plt.subplots()여러 개의 축이 있고 잘 작동합니다.

def save(filepath, fig=None):
    '''Save the current image with no whitespace
    Example filepath: "myfig.png" or r"C:\myfig.pdf" 
    '''
    import matplotlib.pyplot as plt
    if not fig:
        fig = plt.gcf()

    plt.subplots_adjust(0,0,1,1,0,0)
    for ax in fig.axes:
        ax.axis('off')
        ax.margins(0,0)
        ax.xaxis.set_major_locator(plt.NullLocator())
        ax.yaxis.set_major_locator(plt.NullLocator())
    fig.savefig(filepath, pad_inches = 0, bbox_inches='tight')

가장 간단한 방법은 다음과 같습니다.plt.tight_layout사용할 때 불필요한 크롭을 하지 않기 때문에 실제로 더 선호되는 변환plt.savefig

import matplotlib as plt    
plt.plot([1,2,3], [1,2,3])
plt.tight_layout(pad=0)
plt.savefig('plot.png')

그러나 이 값은 그림을 수정하는 복잡한 그림에는 적합하지 않을 수 있습니다.에서 사용하는 요하네스 S의 답변을 참조해 주세요.plt.subplots_adjust만약 그렇다면.

나는 다음 코드가 그 일에 딱 들어맞는다는 것을 알았다.

fig = plt.figure(figsize=[6,6])
ax = fig.add_subplot(111)
ax.imshow(data)
ax.axes.get_xaxis().set_visible(False)
ax.axes.get_yaxis().set_visible(False)
ax.set_frame_on(False)
plt.savefig('data.png', dpi=400, bbox_inches='tight',pad_inches=0)

은 나에게 가 있었다.plt.savefig(save_path,bbox_inches='tight', pad_inches=0, transparent=True)

이 순서를 따라 했더니 잘 되더라고요.

plt.axis("off")
fig=plt.imshow(image array,interpolation='nearest')
fig.axes.get_xaxis().set_visible(False)
fig.axes.get_yaxis().set_visible(False)
plt.savefig('destination_path.pdf',
    bbox_inches='tight', pad_inches=0, format='pdf', dpi=1200)

제가 발견한 훨씬 간단한 접근법은plt.imsave:

    import matplotlib.pyplot as plt
    arr = plt.imread(path)
    plt.imsave('test.png', arr)

인치가 아닌 픽셀 단위로 작업하고 싶은 사람에게는 이 방법이 적합합니다.

또, 통상적인 것도 필요

from matplotlib.transforms import Bbox

그런 다음 다음을 사용할 수 있습니다.

my_dpi = 100 # Good default - doesn't really matter

# Size of output in pixels
h = 224
w = 224

fig, ax = plt.subplots(1, figsize=(w/my_dpi, h/my_dpi), dpi=my_dpi)

ax.set_position([0, 0, 1, 1]) # Critical!

# Do some stuff
ax.imshow(img)
ax.imshow(heatmap) # 4-channel RGBA
ax.plot([50, 100, 150], [50, 100, 150], color="red")

ax.axis("off")

fig.savefig("saved_img.png",
            bbox_inches=Bbox([[0, 0], [w/my_dpi, h/my_dpi]]),
            dpi=my_dpi)

여기에 이미지 설명 입력

따라서 솔루션은 하위구를 조정하는지 여부에 따라 달라집니다.plt.subplots_adjust(위, 아래, 오른쪽, 왼쪽)를 지정하면 역설적으로 공백 패딩이 생성되므로 bbox_subplots='tight'의 kwargs를 plt.savefig와 함께 사용할 필요가 없습니다.또, 입력 이미지와 같은 DIM으로 이미지를 보존할 수 있습니다(600 x 600 의 입력 이미지는 600 x 600 픽셀의 출력 이미지로 보존됩니다).

출력 이미지 크기 일관성에 관심이 없는 경우 plt.subplots_adjust 속성을 생략하고 bbox_subplots='tight' 및 pad_subplots=0 kwargs를 plt.savefig와 함께 사용할 수 있습니다.

이 솔루션은 matplotlib 버전 3.0.1, 3.0.3 및 3.2.1에서 작동합니다.둘 이상의 하위구(예: plt.subplots(2,2,...))가 있는 경우에도 사용할 수 있습니다.

def save_inp_as_output(_img, c_name, dpi=100):
    h, w, _ = _img.shape
    fig, axes = plt.subplots(figsize=(h/dpi, w/dpi))
    fig.subplots_adjust(top=1.0, bottom=0, right=1.0, left=0, hspace=0, wspace=0) 
    axes.imshow(_img)
    axes.axis('off')
    plt.savefig(c_name, dpi=dpi, format='jpeg') 

이거 드셔보세요.내 문제는 해결됐어

import matplotlib.image as mpimg
img = mpimg.imread("src.png")
mpimg.imsave("out.png", img, cmap=cmap)

Jupyter 노트북에서는 다음 행을 추가할 수 있습니다.

%config InlineBackend.print_figure_kwargs = {'pad_inches':0}

최소한의 예를 다음에 제시하겠습니다.

import matplotlib.pyplot as plt
import numpy as np

%config InlineBackend.print_figure_kwargs = {'pad_inches':0}

fig, ax = plt.subplots()
ax.axis("off")
ax.imshow(np.fromfunction(lambda i, j: np.sin(j), (15, 15)), cmap="YlGnBu")

여기에 이미지 설명 입력

이것은 imshow와 함께 플롯된 numpy 배열을 파일에 저장하는 데 도움이 됩니다.

import matplotlib.pyplot as plt

fig = plt.figure(figsize=(10,10))
plt.imshow(img) # your image here
plt.axis("off")
plt.subplots_adjust(top = 1, bottom = 0, right = 1, left = 0, 
        hspace = 0, wspace = 0)
plt.savefig("example2.png", box_inches='tight', dpi=100)
plt.show()

언급URL : https://stackoverflow.com/questions/11837979/removing-white-space-around-a-saved-image

반응형