В настоящее время я работаю над задачей обработки изображений, в которой мне нужно определить ячейки сетки и создать патчи с каждым патчем в качестве сетки ячейки. Я мог бы сгенерировать следующий вывод, используя код под изображением.
import numpy as np
import pandas as pd
import time
from datetime import datetime
# from PIL import Image
import torch
import os, sys
import math
import cv2
# In[11]:
image = cv2.imread('../data/classes2.jpg')
print('rgb img shape : ',image.shape)
mask = np.zeros(image.shape, dtype=np.uint8)
gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
print('gray img shape : ',gray.shape)
thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]
# In[15]:
# Detect only grid
cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# print(cnts)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
area = cv2.contourArea(c)
print(area)
if area > 10000:
cv2.drawContours(mask, [c], -1, (255,255,255), -1)
# In[16]:
mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)
mask = cv2.bitwise_and(mask, thresh)
# In[17]:
# Find horizontal lines
horizontal_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (55,1))
detect_horizontal = cv2.morphologyEx(mask, cv2.MORPH_OPEN, horizontal_kernel, iterations=2)
cnts = cv2.findContours(detect_horizontal, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
cv2.drawContours(image, [c], -1, (0,0,255), 2)
# In[18]:
# Find vertical lines
vertical_kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (1,25))
detect_vertical = cv2.morphologyEx(mask, cv2.MORPH_OPEN, vertical_kernel, iterations=2)
cnts = cv2.findContours(detect_vertical, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cnts = cnts[0] if len(cnts) == 2 else cnts[1]
for c in cnts:
cv2.drawContours(image, [c], -1, (0,0,255), 2)
# In[19]:
cv2.imshow('thresh', thresh)
cv2.imshow('mask', mask)
cv2.imshow('image', image)
cv2.waitKey()
Однако я не смог полностью идентифицировать линии сетки в контурная. Я даже пытался отточить изображение, но все равно безуспешно. Я новичок в обработке изображений. Исходное изображение:
Редактировать
один патч = одна ячейка сетки ie. одна ячейка желтого или оранжевого или белого цвета сетки. Моя цель состоит в том, чтобы идентифицировать сетку, очерчивая ее, а затем обрезать ячейку сетки за ячейкой, где каждая квадратная ячейка будет действовать как участок, а затем мне нужно определить цвет участка / ячейки. Здесь каждый патч будет сохранен как изображение.
Я изменил код, но некоторые ячейки все еще отсутствуют. Есть ли лучший способ идентифицировать ячейки и обрезать их как патч и определить их цвет вместо того, чтобы сначала идентифицировать сетку. В настоящее время я получаю следующий вывод:
для вышеприведенного вывода я сослался с кодом из: ссылка на идентификацию сетки в изображении python код
Пробуя это с жестким кодированием, я получаю перекрывающиеся патчи. Я попробовал следующий код:
image = cv2.imread(image_path + 'classes2.jpg')
#claculate patch pixels
white_x_pixels = 5
white_y_pixels = 5
grid_rows, grid_cols = 50,51
patch_row_pixels = round((image.shape[0])/50,2)
patch_col_pixels = round((image.shape[1])/51,2)
print('patch_row_pixels : ',patch_row_pixels)
print('patch_col_pixels : ',patch_col_pixels)
w = ceil(patch_col_pixels)
h = floor(patch_row_pixels)
print('w:{},h:{}'.format(w,h))
image_number = 0
coord_dict = {}
for r in range(grid_rows):#(49,50):#(grid_rows):
# y = white_y_pixels + r*(h)
if r in [0,1,2]:
y = white_y_pixels + r*(h)
else :
y = r*(h) - 1
yh = int(y+h) - white_y_pixels
y = int(y)
for c in range(grid_cols):#(49,51):#(grid_cols):#(1):#(grid_cols):
coord_dict[image_number] = {}
if c in [0,1,2]:
x = white_x_pixels + c*(w)# - white_x_pixels)#patch_col_pixels
else:
x = c*(w) - (white_x_pixels - 1)
xw = int(x+w) - white_x_pixels
x = int(x)
ROI = image[y:yh,x:xw]
coord_dict[image_number]['x'] = x
coord_dict[image_number]['x+w'] = x+w
coord_dict[image_number]['y'] = y
coord_dict[image_number]['y+h'] = y+h
coord_dict[image_number]['w'] = w
coord_dict[image_number]['h'] = h
print(x,xw,y,yh)
cv2.imwrite('ROI_'+str(image_number) + '.png',ROI)
# cv2.imshow('ROI_'+str(image_number),ROI)
# cv2.waitKey(0)
# cv2.destroyAllWindows()
image_number += 1