Anda dapat menggunakan algoritma pewarnaan standar. Algoritma ini menggantikan piksel yang ditandai dalam gambar dengan nilai piksel yang mengelilingi piksel yang ditandai ini. Tantangannya di sini adalah untuk mendeteksi kisi (tes saya tampaknya menunjukkan bahwa itu bukan kisi yang benar-benar teratur). Jadi, saya datang dengan solusi ini:
from PIL import Image
import requests
from io import BytesIO
import cv2
url = "http://i.stack.imgur.com/Ahrnl.jpg"
response = requests.get(url)
img = Image.open(BytesIO(response.content))
plt.imshow(img)
A = np.array(img)
A2 = A.copy()
A_gray = cv2.cvtColor(A, cv2.COLOR_RGB2GRAY)
# Do some rough edge detection to find the grid
sX = cv2.Sobel(A_gray, cv2.CV_64F, 1, 0, ksize=3)
sY = cv2.Sobel(A_gray, cv2.CV_64F, 0, 1, ksize=3)
sX[sX<0] = 0
sY[sY<0] = 0
plt.subplot(221)
plt.imshow(sX)
plt.subplot(222)
plt.imshow(sY)
plt.subplot(223)
# the sum operation projects the edges to the X or Y-axis.
# The 0.2 damps the high peaks a little
eX = (sX**.2).sum(axis=0)
eX = np.roll(eX, -1) # correct for the 1-pixel offset due to Sobel filtering
plt.plot(eX)
plt.subplot(224)
eY = (sY**.2).sum(axis=1)
eY = np.roll(eY, -1)
plt.plot(eY)
mask = np.zeros(A2.shape[:2], dtype=np.uint8)
mask[eY>480,:] = 1
mask[:, eX>390] = 1
A2[mask.astype(bool),:] = 255
plt.figure()
plt.subplot(221)
plt.imshow(A)
plt.subplot(222)
plt.imshow((A2))
restored = cv2.inpaint(A, mask, 1, cv2.INPAINT_NS)
plt.subplot(223)
plt.imshow(restored)
Output program adalah sebagai berikut:
Untuk mendeteksi kisi-kisi saya melakukan solusi cepat dan kotor. Dapat ditingkatkan banyak, tetapi itu menunjukkan ide awal. Alur umumnya adalah:
- mendeteksi grid
- buat topeng yang menjelaskan piksel mana yang rusak oleh kisi
- pasang piksel yang rusak.
Untuk inpainting saya menggunakan operasi inpaint OpenCV . Untuk mendeteksi kisi, saya melakukan deteksi tepi dalam arah X dan Y menggunakan filter Sobel. Lalu saya menambahkan semua nilai tepi dalam arah-X dan arah-Y untuk menemukan puncak, di mana garis-garis kisi berada. Lalu, saya memilih puncak tertinggi sebagai koordinat tempat garis kisi diperkirakan. Ini tidak berfungsi sempurna (misalnya tepi yang kuat pada gambar dideteksi secara salah sebagai garis kisi), tetapi itu menunjukkan ide. Hal ini dapat ditingkatkan dengan misalnya transformasi Hough untuk menemukan garis, menendang keluar tepi yang sangat kuat dll.
Atau, jika kisi-kisi benar-benar sama untuk semua gambar, maka Anda dapat melakukan deteksi kisi bersama untuk semua gambar, yang akan menghasilkan akurasi yang jauh lebih baik (cukup lakukan teknik di atas, tetapi sebelum memilih puncak, jumlahkan hasil dari semua gambar). Secara lebih rinci, Anda akan menghitung eX untuk semua gambar dan menambahkan semua eX ini menjadi satu vektor. Vektor ini akan memiliki struktur puncak yang jauh lebih jelas dan ambang dapat dilakukan dengan lebih mudah.