get("#348") -- rgb functions get("#346") -- getcrop get("#337") -- map(list, f) w, h = img.width, img.height brightnessThreshold = 0.9 function isEmpty(y) for x=0, w-1 do if bright(rgb(img.getInt(x, y))) <= brightnessThreshold then return false end end return true end lastEmpty = true segments = {} for y=0, h-1 do empty = isEmpty(y) if empty and not lastEmpty then table.insert(segments, {start, y}) elseif not empty and lastEmpty then start = y end lastEmpty = empty end if not lastEmpty then table.insert(segments, {start, h}) end if #segments <= 1 then -- don't bother with only 1 segment return end result = {} for _, seg in ipairs(segments) do local sy1, sy2 = unpack(seg) local cropped = { width = img.width, height = sy2-sy1, getInt = function(x, y) return img.getInt(x, y+sy1) end } local x1, y1, x2, y2 = getcrop(cropped) table.insert(result, x1..", "..(y1+sy1)..", "..x2..", "..(y2+sy1)) end return "Parts: "..table.concat(result, "|")