草庐IT

objective-c - CIAreaHistogram 给了我除了最后一个元素之外的所有 0?

coder 2023-09-07 原文

我想计算一个 NSImage 的直方图,所以我自然而然地转向了 CIFilter。有一个名为 CIAreaHistogram 的过滤器可以满足我的需求。这是我的代码:

NSBitmapImageRep *rep = [image bitmapImageRepresentation];
CIImage* hImage = nil;
@autoreleasepool {
    CIImage *input = [[CIImage alloc] initWithBitmapImageRep:rep];
    CIFilter *histogramFilter = [CIFilter filterWithName:@"CIAreaHistogram"];
    [histogramFilter setDefaults];
    [histogramFilter setValue:input forKey:kCIInputImageKey];
    [histogramFilter setValue:[CIVector vectorWithCGRect:[input extent]] forKeyPath:@"inputExtent"];
    [histogramFilter setValue:[NSNumber numberWithInt:256] forKeyPath:@"inputCount"];
    [histogramFilter setValue:[NSNumber numberWithFloat:1.0] forKey:@"inputScale"];

    hImage = [histogramFilter valueForKey:kCIOutputImageKey];
    input = nil;

    NSImage *result = nil;
    @autoreleasepool
    {
        NSCIImageRep *rep = [NSCIImageRep imageRepWithCIImage:hImage];
        result = [[NSImage alloc] initWithSize:rep.size];
        [result addRepresentation:rep];
    }

    NSBitmapImageRep *imgRep = [result bitmapImageRepresentation];
    for (int y = 0; y < imgRep.size.height; y ++) {
        for (int x = 0; x < imgRep.size.width; x ++) {
            NSUInteger pixel[4];
            [imgRep getPixel:pixel atX:x y:y];
            NSLog(@"(%d, %d): %lu - %lu - %lu - %lu", x, y, pixel[0], pixel[1], pixel[2], pixel[3]);
        }
    }
}

bitmapImageRepresentation 只是一个将NSImage 转换为NSBitmapImageRep 的帮助方法。我已经对其进行了很多测试和使用,看起来很酷。

输出如下:

(0, 0): 0 - 0 - 0 - 0
(1, 0): 0 - 0 - 0 - 0
(2, 0): 0 - 0 - 0 - 0
(3, 0): 0 - 0 - 0 - 0
(4, 0): 0 - 0 - 0 - 0
(5, 0): 0 - 0 - 0 - 0
(6, 0): 0 - 0 - 0 - 0
(7, 0): 0 - 0 - 0 - 0
(8, 0): 0 - 0 - 0 - 0
(9, 0): 0 - 0 - 0 - 0
(10, 0): 0 - 0 - 0 - 0
(11, 0): 0 - 0 - 0 - 0
(12, 0): 0 - 0 - 0 - 0
(13, 0): 0 - 0 - 0 - 0
(14, 0): 0 - 0 - 0 - 0
(15, 0): 0 - 0 - 0 - 0
(16, 0): 0 - 0 - 0 - 0
(17, 0): 0 - 0 - 0 - 0
(18, 0): 0 - 0 - 0 - 0
(19, 0): 0 - 0 - 0 - 0
(20, 0): 0 - 0 - 0 - 0
(21, 0): 0 - 0 - 0 - 0
(22, 0): 0 - 0 - 0 - 0
(23, 0): 0 - 0 - 0 - 0
(24, 0): 0 - 0 - 0 - 0
(25, 0): 0 - 0 - 0 - 0
(26, 0): 0 - 0 - 0 - 0
(27, 0): 0 - 0 - 0 - 0
(28, 0): 0 - 0 - 0 - 0
(29, 0): 0 - 0 - 0 - 0
(30, 0): 0 - 0 - 0 - 0
(31, 0): 0 - 0 - 0 - 0
(32, 0): 0 - 0 - 0 - 0
(33, 0): 0 - 0 - 0 - 0
(34, 0): 0 - 0 - 0 - 0
(35, 0): 0 - 0 - 0 - 0
(36, 0): 0 - 0 - 0 - 0
(37, 0): 0 - 0 - 0 - 0
(38, 0): 0 - 0 - 0 - 0
(39, 0): 0 - 0 - 0 - 0
(40, 0): 0 - 0 - 0 - 0
(41, 0): 0 - 0 - 0 - 0
(42, 0): 0 - 0 - 0 - 0
(43, 0): 0 - 0 - 0 - 0
(44, 0): 0 - 0 - 0 - 0
(45, 0): 0 - 0 - 0 - 0
(46, 0): 0 - 0 - 0 - 0
(47, 0): 0 - 0 - 0 - 0
(48, 0): 0 - 0 - 0 - 0
(49, 0): 0 - 0 - 0 - 0
(50, 0): 0 - 0 - 0 - 0
(51, 0): 0 - 0 - 0 - 0
(52, 0): 0 - 0 - 0 - 0
(53, 0): 0 - 0 - 0 - 0
(54, 0): 0 - 0 - 0 - 0
(55, 0): 0 - 0 - 0 - 0
(56, 0): 0 - 0 - 0 - 0
(57, 0): 0 - 0 - 0 - 0
(58, 0): 0 - 0 - 0 - 0
(59, 0): 0 - 0 - 0 - 0
(60, 0): 0 - 0 - 0 - 0
(61, 0): 0 - 0 - 0 - 0
(62, 0): 0 - 0 - 0 - 0
(63, 0): 0 - 0 - 0 - 0
(64, 0): 0 - 0 - 0 - 0
(65, 0): 0 - 0 - 0 - 0
(66, 0): 0 - 0 - 0 - 0
(67, 0): 0 - 0 - 0 - 0
(68, 0): 0 - 0 - 0 - 0
(69, 0): 0 - 0 - 0 - 0
(70, 0): 0 - 0 - 0 - 0
(71, 0): 0 - 0 - 0 - 0
(72, 0): 0 - 0 - 0 - 0
(73, 0): 0 - 0 - 0 - 0
(74, 0): 0 - 0 - 0 - 0
(75, 0): 0 - 0 - 0 - 0
(76, 0): 0 - 0 - 0 - 0
(77, 0): 0 - 0 - 0 - 0
(78, 0): 0 - 0 - 0 - 0
(79, 0): 0 - 0 - 0 - 0
(80, 0): 0 - 0 - 0 - 0
(81, 0): 0 - 0 - 0 - 0
(82, 0): 0 - 0 - 0 - 0
(83, 0): 0 - 0 - 0 - 0
(84, 0): 0 - 0 - 0 - 0
(85, 0): 0 - 0 - 0 - 0
(86, 0): 0 - 0 - 0 - 0
(87, 0): 0 - 0 - 0 - 0
(88, 0): 0 - 0 - 0 - 0
(89, 0): 0 - 0 - 0 - 0
(90, 0): 0 - 0 - 0 - 0
(91, 0): 0 - 0 - 0 - 0
(92, 0): 0 - 0 - 0 - 0
(93, 0): 0 - 0 - 0 - 0
(94, 0): 0 - 0 - 0 - 0
(95, 0): 0 - 0 - 0 - 0
(96, 0): 0 - 0 - 0 - 0
(97, 0): 0 - 0 - 0 - 0
(98, 0): 0 - 0 - 0 - 0
(99, 0): 0 - 0 - 0 - 0
(100, 0): 0 - 0 - 0 - 0
(101, 0): 0 - 0 - 0 - 0
(102, 0): 0 - 0 - 0 - 0
(103, 0): 0 - 0 - 0 - 0
(104, 0): 0 - 0 - 0 - 0
(105, 0): 0 - 0 - 0 - 0
(106, 0): 0 - 0 - 0 - 0
(107, 0): 0 - 0 - 0 - 0
(108, 0): 0 - 0 - 0 - 0
(109, 0): 0 - 0 - 0 - 0
(110, 0): 0 - 0 - 0 - 0
(111, 0): 0 - 0 - 0 - 0
(112, 0): 0 - 0 - 0 - 0
(113, 0): 0 - 0 - 0 - 0
(114, 0): 0 - 0 - 0 - 0
(115, 0): 0 - 0 - 0 - 0
(116, 0): 0 - 0 - 0 - 0
(117, 0): 0 - 0 - 0 - 0
(118, 0): 0 - 0 - 0 - 0
(119, 0): 0 - 0 - 0 - 0
(120, 0): 0 - 0 - 0 - 0
(121, 0): 0 - 0 - 0 - 0
(122, 0): 0 - 0 - 0 - 0
(123, 0): 0 - 0 - 0 - 0
(124, 0): 0 - 0 - 0 - 0
(125, 0): 0 - 0 - 0 - 0
(126, 0): 0 - 0 - 0 - 0
(127, 0): 0 - 0 - 0 - 0
(128, 0): 0 - 0 - 0 - 0
(129, 0): 0 - 0 - 0 - 0
(130, 0): 0 - 0 - 0 - 0
(131, 0): 0 - 0 - 0 - 0
(132, 0): 0 - 0 - 0 - 0
(133, 0): 0 - 0 - 0 - 0
(134, 0): 0 - 0 - 0 - 0
(135, 0): 0 - 0 - 0 - 0
(136, 0): 0 - 0 - 0 - 0
(137, 0): 0 - 0 - 0 - 0
(138, 0): 0 - 0 - 0 - 0
(139, 0): 0 - 0 - 0 - 0
(140, 0): 0 - 0 - 0 - 0
(141, 0): 0 - 0 - 0 - 0
(142, 0): 0 - 0 - 0 - 0
(143, 0): 0 - 0 - 0 - 0
(144, 0): 0 - 0 - 0 - 0
(145, 0): 0 - 0 - 0 - 0
(146, 0): 0 - 0 - 0 - 0
(147, 0): 0 - 0 - 0 - 0
(148, 0): 0 - 0 - 0 - 0
(149, 0): 0 - 0 - 0 - 0
(150, 0): 0 - 0 - 0 - 0
(151, 0): 0 - 0 - 0 - 0
(152, 0): 0 - 0 - 0 - 0
(153, 0): 0 - 0 - 0 - 0
(154, 0): 0 - 0 - 0 - 0
(155, 0): 0 - 0 - 0 - 0
(156, 0): 0 - 0 - 0 - 0
(157, 0): 0 - 0 - 0 - 0
(158, 0): 0 - 0 - 0 - 0
(159, 0): 0 - 0 - 0 - 0
(160, 0): 0 - 0 - 0 - 0
(161, 0): 0 - 0 - 0 - 0
(162, 0): 0 - 0 - 0 - 0
(163, 0): 0 - 0 - 0 - 0
(164, 0): 0 - 0 - 0 - 0
(165, 0): 0 - 0 - 0 - 0
(166, 0): 0 - 0 - 0 - 0
(167, 0): 0 - 0 - 0 - 0
(168, 0): 0 - 0 - 0 - 0
(169, 0): 0 - 0 - 0 - 0
(170, 0): 0 - 0 - 0 - 0
(171, 0): 0 - 0 - 0 - 0
(172, 0): 0 - 0 - 0 - 0
(173, 0): 0 - 0 - 0 - 0
(174, 0): 0 - 0 - 0 - 0
(175, 0): 0 - 0 - 0 - 0
(176, 0): 0 - 0 - 0 - 0
(177, 0): 0 - 0 - 0 - 0
(178, 0): 0 - 0 - 0 - 0
(179, 0): 0 - 0 - 0 - 0
(180, 0): 0 - 0 - 0 - 0
(181, 0): 0 - 0 - 0 - 0
(182, 0): 0 - 0 - 0 - 0
(183, 0): 0 - 0 - 0 - 0
(184, 0): 0 - 0 - 0 - 0
(185, 0): 0 - 0 - 0 - 0
(186, 0): 0 - 0 - 0 - 0
(187, 0): 0 - 0 - 0 - 0
(188, 0): 0 - 0 - 0 - 0
(189, 0): 0 - 0 - 0 - 0
(190, 0): 0 - 0 - 0 - 0
(191, 0): 0 - 0 - 0 - 0
(192, 0): 0 - 0 - 0 - 0
(193, 0): 0 - 0 - 0 - 0
(194, 0): 0 - 0 - 0 - 0
(195, 0): 0 - 0 - 0 - 0
(196, 0): 0 - 0 - 0 - 0
(197, 0): 0 - 0 - 0 - 0
(198, 0): 0 - 0 - 0 - 0
(199, 0): 0 - 0 - 0 - 0
(200, 0): 0 - 0 - 0 - 0
(201, 0): 0 - 0 - 0 - 0
(202, 0): 0 - 0 - 0 - 0
(203, 0): 0 - 0 - 0 - 0
(204, 0): 0 - 0 - 0 - 0
(205, 0): 0 - 0 - 0 - 0
(206, 0): 0 - 0 - 0 - 0
(207, 0): 0 - 0 - 0 - 0
(208, 0): 0 - 0 - 0 - 0
(209, 0): 0 - 0 - 0 - 0
(210, 0): 0 - 0 - 0 - 0
(211, 0): 0 - 0 - 0 - 0
(212, 0): 0 - 0 - 0 - 0
(213, 0): 0 - 0 - 0 - 0
(214, 0): 0 - 0 - 0 - 0
(215, 0): 0 - 0 - 0 - 0
(216, 0): 0 - 0 - 0 - 0
(217, 0): 0 - 0 - 0 - 0
(218, 0): 0 - 0 - 0 - 0
(219, 0): 0 - 0 - 0 - 0
(220, 0): 0 - 0 - 0 - 0
(221, 0): 0 - 0 - 0 - 0
(222, 0): 0 - 0 - 0 - 0
(223, 0): 0 - 0 - 0 - 0
(224, 0): 0 - 0 - 0 - 0
(225, 0): 0 - 0 - 0 - 0
(226, 0): 0 - 0 - 0 - 0
(227, 0): 0 - 0 - 0 - 0
(228, 0): 0 - 0 - 0 - 0
(229, 0): 0 - 0 - 0 - 0
(230, 0): 0 - 0 - 0 - 0
(231, 0): 0 - 0 - 0 - 0
(232, 0): 0 - 0 - 0 - 0
(233, 0): 0 - 0 - 0 - 0
(234, 0): 0 - 0 - 0 - 0
(235, 0): 0 - 0 - 0 - 0
(236, 0): 0 - 0 - 0 - 0
(237, 0): 0 - 0 - 0 - 0
(238, 0): 0 - 0 - 0 - 0
(239, 0): 0 - 0 - 0 - 0
(240, 0): 0 - 0 - 0 - 0
(241, 0): 0 - 0 - 0 - 0
(242, 0): 0 - 0 - 0 - 0
(243, 0): 0 - 0 - 0 - 0
(244, 0): 0 - 0 - 0 - 0
(245, 0): 0 - 0 - 0 - 0
(246, 0): 0 - 0 - 0 - 0
(247, 0): 0 - 0 - 0 - 0
(248, 0): 0 - 0 - 0 - 0
(249, 0): 0 - 0 - 0 - 0
(250, 0): 0 - 0 - 0 - 0
(251, 0): 0 - 0 - 0 - 0
(252, 0): 0 - 0 - 0 - 0
(253, 0): 0 - 0 - 0 - 0
(254, 0): 0 - 0 - 0 - 0
(255, 0): 0 - 0 - 0 - 255

除最后一个 alpha 值外,所有 buckets 均为 0。我想知道是否有人曾经使用过这个过滤器,并且很友好地向我解释......非常感谢!

最佳答案

我在这里写了一篇关于如何做到这一点的帖子: http://shapeof.com/archives/2011/08/drawing_a_histogram_with_core_image.html

简而言之:您需要将值读取为 float ,而不是整数,这意味着您必须连接一个 CGBitmapContext 以进行位 block 传输。或者,如果您将所有内容都保存在 CI 领域,您将需要另一个过滤器来读取数据并用它打印出一些东西。

关于objective-c - CIAreaHistogram 给了我除了最后一个元素之外的所有 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24613936/

有关objective-c - CIAreaHistogram 给了我除了最后一个元素之外的所有 0?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby - 如何以所有可能的方式将字符串拆分为长度最多为 3 的连续子字符串? - 2

    我试图获取一个长度在1到10之间的字符串,并输出将字符串分解为大小为1、2或3的连续子字符串的所有可能方式。例如:输入:123456将整数分割成单个字符,然后继续查找组合。该代码将返回以下所有数组。[1,2,3,4,5,6][12,3,4,5,6][1,23,4,5,6][1,2,34,5,6][1,2,3,45,6][1,2,3,4,56][12,34,5,6][12,3,45,6][12,3,4,56][1,23,45,6][1,2,34,56][1,23,4,56][12,34,56][123,4,5,6][1,234,5,6][1,2,345,6][1,2,3,456][123

  3. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  4. ruby-on-rails - Rails - 一个 View 中的多个模型 - 2

    我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何

  5. ruby-on-rails - 渲染另一个 Controller 的 View - 2

    我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>

  6. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  7. ruby-on-rails - 如果 Object::try 被发送到一个 nil 对象,为什么它会起作用? - 2

    如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象

  8. ruby - 为什么 SecureRandom.uuid 创建一个唯一的字符串? - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion为什么SecureRandom.uuid创建一个唯一的字符串?SecureRandom.uuid#=>"35cb4e30-54e1-49f9-b5ce-4134799eb2c0"SecureRandom.uuid方法创建的字符串从不重复?

  9. ruby-on-rails - 跳过状态机方法的所有验证 - 2

    当我的预订模型通过rake任务在状态机上转换时,我试图找出如何跳过对ActiveRecord对象的特定实例的验证。我想在reservation.close时跳过所有验证!叫做。希望调用reservation.close!(:validate=>false)之类的东西。仅供引用,我们正在使用https://github.com/pluginaweek/state_machine用于状态机。这是我的预订模型的示例。classReservation["requested","negotiating","approved"])}state_machine:initial=>'requested

  10. ruby - Nokogiri 剥离所有属性 - 2

    我有这个html标记:我想得到这个:我如何使用Nokogiri做到这一点? 最佳答案 require'nokogiri'doc=Nokogiri::HTML('')您可以通过xpath删除所有属性:doc.xpath('//@*').remove或者,如果您需要做一些更复杂的事情,有时使用以下方法遍历所有元素会更容易:doc.traversedo|node|node.keys.eachdo|attribute|node.deleteattributeendend 关于ruby-Nokog

随机推荐