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

Python 如何找到最右边黑色像素的位置,python,numpy,image-processing,python-imaging-library,scikit-image,Python,Numpy,Image Processing,Python Imaging Library,Scikit Image,一张黑白照片,显示相框内的笑脸 我想要的是找出微笑脸上最合适的点的位置。(在这种情况下,黑色应位于图像的“184,91”左右) 通过使用下面的方法,我希望列出图像中的颜色,然后看看可以进一步查找什么 from PIL import Image im = Image.open("face.jpg") print im.convert('RGB').getcolors() # or print im.getcolors() 但是它返回None,我被卡住了 我怎样才能得到脸部最合适的位置?作为一种

一张黑白照片,显示相框内的笑脸

我想要的是找出微笑脸上最合适的点的位置。(在这种情况下,黑色应位于图像的“184,91”左右)

通过使用下面的方法,我希望列出图像中的颜色,然后看看可以进一步查找什么

from PIL import Image
im = Image.open("face.jpg")
print im.convert('RGB').getcolors() # or print im.getcolors()
但是它返回
None
,我被卡住了


我怎样才能得到脸部最合适的位置?

作为一种间接的方法,也许我可以: 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")
教如何删除圆形白色部分

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

我的电话号码是131132。因此,131,66应该是图像中最正确的点。

这是我提出的解决方案:

import numpy as np
from skimage import io

img = io.imread('https://i.stack.imgur.com/sbqcu.jpg', 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))
这与笑脸最右边有一条垂直直线的事实是一致的

必须仔细选择阈值,以避免检测到噪声像素:

threshold = .95
io.imshow(crop < threshold)
threshold=.95
io.imshow(作物<阈值)

这不是问题的答案,但你知道星空边界有更多的黑点吗?@tobias_k,谢谢你的评论。我在想是否有办法将搜索限制在某个范围内,例如从“40,30”到“200160”等。好吧,你可以
裁剪图像,但是你需要知道笑脸的大小(为了不裁剪太多),以确定笑脸的大小…好的。您能否分享一种方法来检测图像的最右颜色点(将其视为裁剪图像)?谢谢。不幸的是,我不能(否则我会);我可以复制不给出任何结果的方法,但我恐怕知道的PIL太少,无法提供帮助。然而,这131,66是微笑中最右边的,而不是完整图像中最右边的位置。
threshold = .95
io.imshow(crop < threshold)