Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python:如何在RGB图像上实现二进制过滤器?(算法)_Python_Image_Algorithm_Filter_Graphics - Fatal编程技术网

Python:如何在RGB图像上实现二进制过滤器?(算法)

Python:如何在RGB图像上实现二进制过滤器?(算法),python,image,algorithm,filter,graphics,Python,Image,Algorithm,Filter,Graphics,我正在尝试使用python和PyQT5实现二值图像过滤器(以获得单色二值图像),并且,为了检索新的像素颜色,我使用以下方法: def _new_pixel_colors(self, x, y): color = QColor(self.pixmap.pixel(x, y)) result = qRgb(0, 0, 0) if all(c < 127 for c in color.getRgb()[:3]) else qRgb(255, 255, 255) ret

我正在尝试使用python和PyQT5实现二值图像过滤器(以获得单色二值图像),并且,为了检索新的像素颜色,我使用以下方法:

def _new_pixel_colors(self, x, y):
    color = QColor(self.pixmap.pixel(x, y))

    result = qRgb(0, 0, 0) if all(c < 127 for c in color.getRgb()[:3]) else qRgb(255, 255, 255)

    return result
def\u新的\u像素\u颜色(自、x、y):
颜色=QColor(self.pixmap.pixel(x,y))
结果=qRgb(0,0,0)如果全部(c<127表示颜色为c.getRgb()[:3]),否则为qRgb(255,255,255)
返回结果
它是否是RGB图像的二值滤波器的正确样本?我的意思是,这是否是检查像素是否比
(127127)
灰色更亮或更暗的充分条件? 和请不要使用opencv、枕头等提供任何解决方案。我只是问一下算法本身。

是您正在寻找的算法类-二进制阈值会将像素设置为0或1,是的

根据期望的输出,考虑将图像首先转换为其他颜色空间,特别是HSL,使用亮度通道。使用

(127、127、127)
作为阈值并不统一考虑亮度,因为RGB的每个通道都是R、G或B的饱和;考虑这个形象:

在其他StackExchange网站上也有很多关于此主题的讨论,例如


我至少会与强度比较
I=R+G+B

对于ROI类遮罩,您可以使用任何阈值技术(自适应阈值是最好的),但如果生成的图像不是ROI遮罩,并且应该与原始图像的视觉特征相似,那么我所知的最佳转换就是使用

BW抖动背后的思想是将灰度转换为BW模式,从而预渲染阴影。结果通常是嘈杂的,但保留了更多的视觉细节。这里是简单的naiveC++抖动(抱歉不是Python程序员):

图片pic0,pic1;
//pic0源img
//pic1-输出img
int x,y,i;
颜色c;
//将输出调整为源图像大小清除为黑色
pic1=pic0;pic1.清晰(0);
//抖动
i=0;

对于(y=0;yAlready回答/接受,但我想添加抖动,因为人们忘记了它,结果明显更好…所以我用这种方法添加了答案,示例Nice Response so+1…我用抖动方法添加了我自己的答案,以防您感兴趣。我还使用了您的图像作为输入进行比较,以防您遇到问题用它评论我,我把它写下来(或者自己编辑出来)
from PIL import Image
import colorsys


def threshold_pixel(r, g, b):
    h, l, s = colorsys.rgb_to_hls(r / 255., g / 255., b / 255.)
    return 1 if l > .36 else 0
    # return 1 if r > 127 and g > 127 and b > 127 else 0


def hlsify(img):
    pixels = img.load()
    width, height = img.size

    # Create a new blank monochrome image.
    output_img = Image.new('1', (width, height), 0)
    output_pixels = output_img.load()

    for i in range(width):
        for j in range(height):
            output_pixels[i, j] = threshold_pixel(*pixels[i, j])

    return output_img


binarified_img = hlsify(Image.open('./sample_img.jpg'))
binarified_img.show()
binarified_img.save('./out.jpg')