2 Home
rune edited this page 2026-08-23 19:27:14 +00:00

Typehus producent tabel Aktive år Hustyper Referencer til byg

Byg

Adresser

Adresser til tjek

Hustype extract plantegning

Import cv2, numpy as np, sys

def load(p, maxdim=2600):
    im = cv2.imread(p, cv2.IMREAD_GRAYSCALE)
    s = maxdim / max(im.shape)
    if s < 1: im = cv2.resize(im, None, fx=s, fy=s, interpolation=cv2.INTER_AREA)
    return im

def ink(gray):
    k = max(15, (min(gray.shape)//40)|1)
    bg = cv2.morphologyEx(gray, cv2.MORPH_CLOSE, cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(k,k)))
    norm = cv2.divide(gray, bg, scale=255)
    norm = cv2.GaussianBlur(norm,(3,3),0)
    _, th = cv2.threshold(norm, 0, 255, cv2.THRESH_BINARY_INV|cv2.THRESH_OTSU)
    return th

def lines(mask, L):
    H = cv2.morphologyEx(mask, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_RECT,(L,1)))
    V = cv2.morphologyEx(mask, cv2.MORPH_OPEN, cv2.getStructuringElement(cv2.MORPH_RECT,(1,L)))
    return H, V

for p in sys.argv[1:]:
    g = load(p)
    m = ink(g)
    L = max(15, int(0.012*max(g.shape)))
    H,V = lines(m, L)
    lm = cv2.bitwise_or(H,V)
    print(p, g.shape, 'ink%', round(100*m.mean()/255,2), 'line%', round(100*lm.mean()/255,2), 'L',L)
    cv2.imwrite(p+'.ink.png', 255-m)
    cv2.imwrite(p+'.lines.png', 255-lm)
    # cluster
    d = cv2.dilate(lm, cv2.getStructuringElement(cv2.MORPH_RECT,(L,L)))
    n, lab, stats, cent = cv2.connectedComponentsWithStats(d, 8)
    boxes=[]
    for i in range(1,n):
        x,y,w,h,a = stats[i]
        if a < 0.002*g.size: continue
        boxes.append((a,x,y,w,h))
    boxes.sort(reverse=True)
    vis = cv2.cvtColor(g, cv2.COLOR_GRAY2BGR)
    for a,x,y,w,h in boxes[:8]:
        sub = lm[y:y+h, x:x+w]
        closed = cv2.morphologyEx(sub, cv2.MORPH_CLOSE, np.ones((max(3,L//3),max(3,L//3)),np.uint8))
        nn, ll, ss, cc = cv2.connectedComponentsWithStats(255-closed, 4)
        cells = [ss[j][4] for j in range(1,nn) if 0.002*w*h < ss[j][4] < 0.35*w*h]
        hv = H[y:y+h,x:x+w].sum()/max(1,V[y:y+h,x:x+w].sum())
        print(f'  box {x},{y} {w}x{h} cells={len(cells)} cellfill={sum(cells)/(w*h):.2f} H/V={hv:.2f}')
        cv2.rectangle(vis,(x,y),(x+w,y+h),(0,0,255),3)
    cv2.imwrite(p+'.boxes.png', vis)