如何创建图像的阈值?

How do I create a threshold of an image?

据我了解,阈值化是一个阶跃函数,这意味着像素值在每一步都被四舍五入。例如。像素值 33 将四舍五入为 32(假设阈值为 32)。在我的代码中,我试图完成阈值处理,但我认为我没有实现它。有人可以指导我我所缺少的吗?

import pylab as plt
import matplotlib.image as mpimg
import numpy as np

 img = np.uint8(mpimg.imread("abby.jpg"))

img = np.uint8((0.2126* img[:,:,0]) + \
np.uint8(0.7152 * img[:,:,1]) +\
np.uint8(0.0722 * img[:,:,2]))

threshold = 128

for row in img:  ## trying to loop through to find if each image pixel > threshold
   for col in row:
      if col > threshold:
        col = threshold
      else:
        col = 0

plt.imshow(img,cmap=plt.cm.gray)
plt.show()

检查您的 for 循环。可能是你在使用 for 循环进行迭代时犯了错误。

if col > threshold:
        col = threshold

这个threshold应该是255,也就是threshold的概念

谢谢

您不是将阈值写入图像文件,而是写入局部变量 c。要读取和写入 numpy 数组,请阅读官方文档 here.

试试下面的代码:-

import pylab as plt
import matplotlib.image as mpimg
import numpy as np
from PIL import Image

img = np.uint8(mpimg.imread("abby.jpg"))

img = np.uint8((0.2126* img[:,:,0]) + \
np.uint8(0.7152 * img[:,:,1]) +\
np.uint8(0.0722 * img[:,:,2]))

threshold = 64

it = np.nditer(img, flags=['multi_index'], op_flags=['writeonly'])
while not it.finished:
    if it[0] > threshold:
        it[0] = threshold
    else:
        it[0] = 0
    it.iternext()

im = Image.fromarray(img)
im.save("output.jpeg")
plt.imshow(img,cmap=plt.cm.gray)
plt.show()

输出图像

注意:注意 matplotlib 如何显示输出图像。它以纯白色显示强度 64,这是不正确的表示。