Как удалить определенную часть изображения? - PullRequest
3 голосов
/ 27 апреля 2019

У меня есть изображение: Исходное изображение

Я хочу удалить серую сетку части изображения, не затрагивая остальную часть изображения, то есть часть внутри черного круга. Я написал код для этого

import cv2
import numpy as np
from PIL import Image
imag = Image.open('results.jpg')
imag.show()

pixelMap = imag.load()

img = Image.new( imag.mode, imag.size)
pixelsNew = img.load()

for i in range(img.size[0]):
    for j in range(img.size[1]):        
        if (( pixelMap[i,j]> (200,0,0)) and (pixelMap[i,j]< (240,0,0))):
            pixelsNew[i,j] = (255,255,255)
        else:
            pixelsNew[i,j] = pixelMap[i,j]
img.show()

с этим кодом у меня получилось следующее изображение: Выходное изображение

Но некоторые пиксели внутри черного круга также были заменены на белые, что мне не нужно. Я хотел бы знать, как можно решить эту проблему.

1 Ответ

2 голосов
/ 27 апреля 2019

Вы можете найти индексы черного круга и присвоить значения пикселям, которые находятся либо слева, либо справа от черного круга.Ниже приведен пример кода для этого

import cv2
import numpy as np

# read the image
img = cv2.imread('original.png')
cv2.imshow("Image", img)

# convert image to numpy array and also to grayscale
img = np.array(img)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# get height and width of image
[rows, cols] = gray.shape

# now extract one row from image, find indices of black circle
# and make those pixels white which are to the left/right
# of black cirlce
for i in range(rows):
    row = gray[i, :] # extract row of image
    indices = np.where(row == 0)    # find indices of black circle
    indices = indices[0]

    # if indices are not empty
    if len(indices) > 0:
        # find starting/ending column index
        si = indices[0]
        ei = indices[len(indices)-1]

        # assign values to the range of pixels
        img[i, 0:si-1] = [255, 255, 255]
        img[i, ei+1:] = [255, 255, 255]
    # if indices is empty then make whole row white
    else:
        img[i,:] = [255, 255, 255]

cv2.imshow("Modified Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

Входное изображение

Input Image

Выходное изображение

Output Image

...