Rendi un'immagine più liscia con lo sfondo cerchiato bianco

Aug 24 2020

Voglio che questo progetto sia fatto in Python
Ho questo mago, voglio che ogni immagine che carichi come immagine sotto


Ogni immagine dovrebbe essere cerchiata in questo modo se è necessario un bordo per renderlo Cerchio aggiungi bordo altrimenti non aggiungere alcun bordo e aggiungi lo sfondo grigio

Risposte

2 fmw42 Aug 24 2020 at 21:56

Ecco un modo per farlo in Python OpenCV.

  • Leggi l'input
  • Calcola dimensione massima, offset e centro di input
  • Crea un'immagine bianca della dimensione massima più imbottitura
  • Inserisce l'immagine in ingresso al centro dell'immagine bianca
  • Crea un'immagine di sfondo grigia della stessa dimensione dell'immagine bianca
  • Disegna un cerchio nero di diametro uguale alla dimensione massima al centro dello sfondo grigio
  • Sfoca il cerchio nero per creare l'ombra esterna
  • Crea un cerchio bianco di diametro uguale alla dimensione massima al centro dell'immagine nera
  • Unisci l'immagine su sfondo bianco con un cerchio nero sfocato sullo sfondo per formare il risultato
  • Salva il risultato

Ingresso:

import cv2
import numpy as np

# load image and get maximum dimension
img = cv2.imread("radio_skull.jpg")
hh, ww = img.shape[:2]
maxwh = max(ww,hh)
offx = (maxwh - ww) // 2
offy = (maxwh - hh) // 2
cx = maxwh // 2
cy = maxwh // 2
pad = 10
pad2 = 2*pad

# create white image of size maxwh plus 10 pixels padding all around
white = np.full((maxwh+pad2, maxwh+pad2, 3), (255,255,255), dtype=np.uint8)

# put input img into center of white image
img_white = white.copy()
img_white[offy+pad:offy+pad+hh, offx+pad:offx+pad+ww] = img

# create light gray background image with 10 pixel padding all around
bckgrnd = np.full((maxwh+pad2,maxwh+pad2,3), (192,192,192), dtype=np.uint8)

# create black circle on background image for drop shadow
cv2.circle(bckgrnd, (cx+pad,cy+pad), cx, (0,0,0), -1)

# blur black circle
bckgrnd = cv2.GaussianBlur(bckgrnd, (25,25), 0)

# create white circle on black background as mask
mask = np.zeros_like(img_white)
cv2.circle(mask, (cx+pad,cy+pad), cx, (255,255,255), -1)

# use mask to blend img_white and bckgrnd
img_white_circle = cv2.bitwise_and(img_white, mask)
bckgrnd_circle = cv2.bitwise_and(bckgrnd, 255-mask)
result = cv2.add(img_white_circle, bckgrnd_circle)

# write result to disk
cv2.imwrite("radio_skull_img_white.jpg", img_white)
cv2.imwrite("radio_skull_background.jpg", bckgrnd)
cv2.imwrite("radio_skull_mask.jpg", mask)
cv2.imwrite("radio_skull_img_white_circle.jpg", img_white_circle)
cv2.imwrite("radio_skull_bckgrnd_circle.jpg", bckgrnd_circle)
cv2.imwrite("radio_skull_result.jpg", result)

# display it
cv2.imshow("img_white", img_white)
cv2.imshow("bckgrnd", bckgrnd)
cv2.imshow("mask", mask)
cv2.imshow("img_white_circle", img_white_circle)
cv2.imshow("bckgrnd_circle", bckgrnd_circle)
cv2.imshow("result", result)
cv2.waitKey(0)

Input su sfondo bianco:

Cerchio nero sfocato sullo sfondo:

Maschera:

Immagine mascherata su bianco:

Cerchio nero mascherato:

Risultato: