создать изображение с границей определенной ширины в Python - PullRequest
0 голосов
/ 15 февраля 2019

Я использовал PIL

#back_color_width 

for x in range(w):
    for y in range(h):
        if x==0 or y==0 or x==w-1 or y==h-1 :
            pixels[x,y] = back_color

Мне нужно добавить границу к изображению с шириной по всем 4 сторонам изображения

Ответы [ 4 ]

0 голосов
/ 15 февраля 2019

Я бы порекомендовал использовать встроенную в PIL функцию expand(), которая позволяет добавлять границы изображения любого цвета и ширины.

Итак, начиная с этого:

enter image description here

#!/usr/bin/env python3

from PIL import Image, ImageOps

# Open image
im = Image.open('start.png')

# Add border and save
bordered = ImageOps.expand(im, border=10, fill=(0,0,0))

bordered.save('result.png')

enter image description here


Если вы хотите различного размера границы сверху / снизу слева- правильно, задайте две ширины:

bordered = ImageOps.expand(im, border=(10,50), fill=(0,0,0)) 

enter image description here


Если вы хотите, чтобы по всем сторонам были границы разного размера, укажите 4 ширины:

bordered = ImageOps.expand(im, border=(10,40,80,120), fill=(0,0,0))

enter image description here

Ключевые слова : PIL, Pillow, ImageOps, Python, border, bordering, border outside, добавить рамку, развернуть,изображение, обработка изображения.

0 голосов
/ 15 февраля 2019

Вы действительно близко!Вам просто нужно изменить первый оператор if.Прямо сейчас у вас есть граница, но ширина со всех сторон составляет 1 пиксель.Может быть, изменить на

if x<back_color_width or y<back_color_width or x > w+ back_color_width or y > w+back_color_width:
    pixel[x,y]=back_color
0 голосов
/ 15 февраля 2019

Если я понял, что вы имели в виду, я думаю, что решение следующее:

import numpy as np

def create_border(img, width, color = np.array([0,0,0]) ):
    #color must be a np.array

    img_shape = img.shape
    upper_border = np.full((width, img_shape[1], 3), color) #for 3-channel image
    side_border = np.full((img_shape[0] + 2*width, width, 3), color)

    bordered = np.concatenate([upper_border, img, upper_border])        
    bordered = np.concatenate([side_border, bordered, side_border], axis=1)

    return bordered
0 голосов
/ 15 февраля 2019

Это то, что вам нужно изменить, чтобы сделать границу любого числа пикселей шириной:

for x in range(w):
    for y in range(h):
        if (x<border_width
            or y<border_width 
            or x>w-border_width-1 
            or y>h-border_width-1):
            pixels[x,y] = (0,0,0)

#other 3 boxes и #primary box Не создает прямоугольники, а вместо этого 3 очка и 1 очко соответственно.

...