如何找到最右边黑色像素的位置

3
一张黑白图片,显示一个笑脸在一个框架里。

smiling face

我希望找到笑脸最右侧的位置。(在这种情况下,黑色应该在图像的大约“184,91”处)
通过使用以下内容,我希望列出图像中的颜色,然后查看可以进一步寻找什么。
from PIL import Image
im = Image.open("face.jpg")
print im.convert('RGB').getcolors() # or print im.getcolors()

然而它返回None,我卡住了。
我该如何获取脸部的最右点?

不是回答问题的内容,但你知道星空边界中有更多的黑点吗? - tobias_k
@tobias_k,感谢您的评论。我在思考是否有一种方法可以将搜索限制在某个范围内,例如从“40,30”到“200,160”等。 - Mark K
你可以使用“裁剪”图像的方法,但是为了不裁剪太多,你需要知道笑脸的大小(以确定笑脸的大小)。 - tobias_k
可以分享一种检测图像中最右侧着色点的方法吗?(将其作为裁剪后的图像)谢谢。 - Mark K
很遗憾,我不能(否则我就会了);我可以重现出返回None的方法,但是我对PIL知之甚少,恐怕无法提供帮助。 - tobias_k
@tobias_k,无论如何感谢您的帮助。 :) - Mark K
2个回答

4
这是我想出来的解决方案:
import numpy as np
from skimage import io

img = io.imread('https://istack.dev59.com/sbqcu.webp', as_grey=True)

left, right, top, bottom = 25, 25, 20, 20
crop = img[top: -bottom, left:- right]
threshold = .85
smiley = crop < threshold

rows, cols = np.nonzero(smiley)
rightmost = cols.max()
indices = np.nonzero(cols==rightmost)

for r, c, in zip(rows[indices], cols[indices]):
    print('(%d, %d)' % (r + top, c + left))

上面的代码会产生以下结果:
(87, 184)
(88, 184)
(89, 184)
(90, 184)
(91, 184)
(92, 184)
(93, 184)
(94, 184)
(95, 184)
(96, 184)
(97, 184)
(98, 184)

这与微笑脸最右侧有一条垂直的直线是一致的。
阈值必须仔细选择,以避免检测到噪点像素:
threshold = .95
io.imshow(crop < threshold)

smiley


1
作为一种间接的方法,也许我可以: 1. 去掉边框 2. 裁剪白色
剩下的就是核心图像本身。如果核心图像具有规则的模式,则图像的尺寸可以告诉坐标。
from PIL import Image

img = Image.open("c:\\smile.jpg")
img2 = img.crop((30, 26, 218, 165))  # remove the frame
img2.save("c:\\cropped-smile.jpg")

使用PIL修剪空白教如何去除圆形的白色部分。

def trim(im):
    bg = Image.new(im.mode, im.size, im.getpixel((0,0)))
    diff = ImageChops.difference(im, bg)
    diff = ImageChops.add(diff, diff, 2.0, -100)
    bbox = diff.getbbox()
    if bbox:
        return im.crop(bbox)

im = Image.open("c:\\cropped-smile.jpg")
im = trim(im)
im.save("c:\\final-smile.jpg")

现在获取核心图像的尺寸。
im = Image.open("c:\\final-sbqcu.jpg")
w, h = im.size

我得到的是131,132。因此,131,66应该是图像的最右点。

然而,这个131.66是笑脸最右边的位置,而不是完整图像中最右边的位置。 - Mark K

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接