gpt4 book ai didi

image - 洪水填充算法 - 忽略边缘

转载 作者:行者123 更新时间:2023-12-03 02:48:47 25 4
gpt4 key购买 nike

到目前为止我已经实现了洪水填充算法。我想调整它,这样它就可以去掉边缘。为了演示这一点,我上传了一张图片:

Image

图像1是我要修改的图像。图 3 是我的算法应该做的事情。 图 2 是我当前的结果。

因此,在本例中,targetColor 为白色,replacementColor 为绿色;

这是我迄今为止所做的伪代码。

doFloodFill(x,y,targetColor,replacementcolor) {

if (x and y not in bounds of image) {
return
}

if (color(x,y) IS NOT targetColor) {
return
}

if (color(x+1, y) IS NOT targetColorOfFloodFill AND color(x+1, y) IS NOT replacementColor OR
color(x-1, y) IS NOT targetColorOfFloodFill AND color(x-1, y) IS NOT replacementColor OR
color(x, y+1) IS NOT targetColorOfFloodFill AND color(x, y+1) IS NOT replacementColor OR
color(y, y-1) IS NOT targetColorOfFloodFill AND color(x, y-1) IS NOT replacementColor) {
return;
}

image.setColor(x, y, replacementColor)

doFloodFill(x+3,y,targetcolor,replacementcolor)
doFloodFill(x-3,y,targetcolor,replacementcolor)
doFloodFill(x,y+3,targetcolor,replacementcolor)
doFloodFill(x,y-3,targetcolor,replacementcolor)
}

此调整已实现到我的洪水填充中。忽略它会导致洪水填充算法正常工作而不会出现任何问题。实际的问题是:如何区分边缘像素和区域内具有不同颜色的像素?

P.S: 我们可以假设 x, y 从区域内开始

最佳答案

我也会选择洪水填充补充。

还有一个想法:

  • 像往常一样淹没
  • 跟踪边界的一个像素:例如最顶部的像素
  • 然后像老鼠一样沿着边界寻找逃脱,并再次使其变白。

const canvas = document.querySelector('canvas');

const M = `
00000000000000000000
00000110011111110000
00001111111110000000
00011111111111100000
00111111111101110010
01111111101111110010
01111111111111110110
01111111111111111110
01111111111111111100
01111111111111111100
01111111111111111100
01111111111111111000
00111111111111111000
00111111111111110000
00011111111111100000
00000000000000000000
`.trim().split('\n').map(x=>x.trim().split('').map(x=>parseInt(x)))

const mat = ({ x, y }, v) => {
if (v) {
M[y][x] = v
}
return M[y][x]
}
const left = ({x,y}) => ({ x: y, y: -x })
const right = ({x,y}) => ({ x: -y, y: x })
const back = ({x, y}) => ({ x: -x, y: -y})
const front = (pos, { x, y }) => ({ x: pos.x + x, y: pos.y + y })
const splinter = {
pos: {
x: 5,
y: 1
},
orig: {
x: 5,
y: 1
},
dir: { x: 1, y: 0 },
atStart() {
return this.pos.x === this.orig.x && this.pos.y === this.orig.y
},
move () {
if (this.atStart() && mat(this.pos) === 2) { return false }
// wall on left
if (mat(front(this.pos, left(this.dir))) === 0) {
// wall on front
if (mat(front(this.pos, this.dir)) === 0) {
// wall on right
if (mat(front(this.pos, right(this.dir))) === 0) {
this.dir = back(this.dir)
} else {
this.dir = right(this.dir)
}
}
this.poop()
} else {
this.dir = left(this.dir)
}
this.moveForward()
return true
},
moveForward () {
this.pos.x += this.dir.x
this.pos.y += this.dir.y
},
poop () {
mat({ x: this.pos.x, y: this.pos.y }, 2)
},
sprite () {
if (this.atStart()) { return 'X' }
if (this.dir.x === -1 && this.dir.y === 0) { return '←' }
if (this.dir.x === 1 && this.dir.y === 0) { return '→'}
if (this.dir.x === 0 && this.dir.y === 1) { return '↓' }
if (this.dir.x === 0 && this.dir.y === -1) { return '↑' }
}
}

function redraw () {
const ctx = canvas.getContext('2d')
const dw = canvas.width / M[0].length
const dh = canvas.height / M.length
const fill = ({ x, y }, color) => {
ctx.fillStyle = color
ctx.fillRect(x * dw, y * dh, dw, dh)
}
const colors = {
1: 'green',
0: 'black',
2: 'white'
}
M.forEach((row, i) => {
row.forEach((el, j) => {
fill({ x: j, y: i }, colors[el])
})
})
const char = splinter.sprite()
ctx.strokeText(char, (splinter.pos.x + 0.1) * dw, (splinter.pos.y + 0.8) * dh)
}
redraw()
document.querySelector('button').onclick = _ => {
splinter.move(); redraw()
}
document.querySelector('button.allmoves').onclick = _ => {
while(splinter.move()){}
redraw()
}
canvas{background:#eeeeee;}
<canvas width="160" height="160"></canvas>
<button>move, rat</button>
<button class="allmoves">move for your life, rat</button>

关于image - 洪水填充算法 - 忽略边缘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59240491/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com