get("#348") -- rgb functions get("#479") -- getcrop2 get("#337") -- map(list, f) get("#388") -- rectangle functions brightnessThreshold = 0.9 function horizontalsplit(img) local function isEmpty(x) for y=0, img.height-1 do if bright(rgb(img.getInt(x, y))) <= brightnessThreshold then return false end end return true end local lastEmpty, start = true, nil local segments = {} for x=0, img.width-1 do empty = isEmpty(x) if empty and not lastEmpty then table.insert(segments, {start, x}) elseif not empty and lastEmpty then start = x end lastEmpty = empty end if not lastEmpty then table.insert(segments, {start, img.width}) end if #segments <= 1 then -- don't bother with only 1 segment return {} end local result = {} for _, seg in ipairs(segments) do local sx1, sx2 = unpack(seg) local cropped = { width = sx2-sx1, height = img.height, getInt = function(x, y) return img.getInt(x+sx1, y) end } local x1, y1, x2, y2 = getcrop2(cropped) table.insert(result, newRectangle(x1+sx1, y1, x2-x1, y2-y1)) end return result end