2013-03-20 28 views
6

Tôi đang tạo ứng dụng sử dụng bộ lọc Hình ảnh lõi CIAreaHistogram. Tôi sử dụng giá trị inputCount (số lượng nhóm) là 10 để thử nghiệm và giá trị inputScale của 1.Đầu vào CIAreaHistogramChính sách số

Tôi nhận được CIImage cho chính biểu đồ, sau đó tôi chạy qua hạt nhân tùy chỉnh (xem cuối bài đăng) đặt giá trị alpha thành 1 (vì nếu không giá trị alpha từ các phép tính biểu đồ được bắt đầu trước) và sau đó chuyển đổi nó thành một số NSBitmapImageRep.

Sau đó, tôi quét qua bộ đệm của đại diện hình ảnh và in các giá trị RGB (bỏ qua các giá trị alpha). Tuy nhiên, khi tôi làm điều này, tổng các giá trị R, G và B trên toàn bộ 10 không nhất thiết phải thêm tối đa 255.

Ví dụ: với hình ảnh hoàn toàn màu đen, tôi áp dụng biểu đồ, sau đó tùy chỉnh hạt nhân và nhận được kết quả sau:

RGB: 255 255 255 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 
RGB: 0 0 0 

Đây là điều tôi mong đợi, vì tất cả các pixel đều có màu đen, vì vậy mọi thứ đều nằm trong nhóm đầu tiên. Tuy nhiên, nếu tôi chạy cùng một thuật toán với hình ảnh màu, tôi nhận được thông tin sau:

RGB: 98 76 81 
RGB: 164 97 87 
RGB: 136 161 69 
RGB: 100 156 135 
RGB: 80 85 185 
RGB: 43 34 45 
RGB: 31 19 8 
RGB: 19 7 3 
RGB: 12 5 2 
RGB: 16 11 11 

Thêm giá trị cho R, G và B - chúng không thêm tối đa 255. Điều này gây ra sự cố Tôi cần phải so sánh hai trong số các biểu đồ này và thuật toán của tôi kỳ vọng số tiền nằm trong khoảng từ 0 đến 255. Tôi rõ ràng có thể mở rộng các giá trị này, nhưng tôi muốn tránh bước bổ sung đó vì lý do hiệu suất.

Tôi nhận thấy điều gì đó thú vị khác có thể cung cấp một số đầu mối về lý do tại sao điều này xảy ra. Trong hạt nhân tùy chỉnh của tôi, tôi chỉ cần đặt giá trị alpha là 1. Tôi đã thử một hạt nhân thứ hai (xem cuối bài đăng) để đặt tất cả các pixel thành màu đỏ. Rõ ràng, các giá trị xanh lục và xanh dương bằng không. Tuy nhiên, tôi nhận được kết quả này khi kiểm tra các giá trị từ đại diện bitmap:

RGB: 255 43 25 

Nhưng tôi chỉ đặt G và B thành 0! Điều này có vẻ là một phần của vấn đề, cho biết quản lý màu sắc. Nhưng kể từ khi tôi dứt khoát thiết lập các giá trị trong hạt nhân, chỉ có một khối mã nơi này có thể xảy ra - chuyển đổi sang một NSBitmapImageRep từ CIImage từ bộ lọc:

NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCIImage:kernelOutput]; 
unsigned char *buf = [bitmapRep bitmapData]; 

Khi tôi đặt pixel RGB 255 0 0, sau đó thực hiện những dòng, sau đó đọc bộ đệm, các giá trị RGB là tất cả 255 43 25. Tôi đã cố gắng tiếp tục thiết lập không gian màu của CGImageRef gốc mà toàn bộ quy trình làm việc dựa trên kCGColorSpaceGenericRGB, nghĩ rằng hồ sơ màu sắc có thể mang theo, nhưng vô ích.

Bất cứ ai có thể cho tôi biết lý do hạt nhân CIFilter hoạt động theo cách này và cách tôi có thể giải quyết nó?

Như đã đề cập trước đây, đây là bản sao các hàm hạt nhân CIFilter tôi sử dụng. Thứ nhất, một trong đó đặt alpha 1:

kernel vec4 adjustHistogram(sampler src) 
{ 
    vec4 pix = sample(src, destCoord()); 
    pix.a = 1.0; 
    return pix; 
} 

Và hôm sau, một trong đó đặt tất cả các pixel RGB 255 0 0 nhưng mà kết thúc lên 255 43 25 khi nó chuyển thành NSBitmapImageRep:

kernel vec4 adjustHistogram(sampler src) 
{ 
    vec4 pix = sample(src, destCoord()); 
    pix.r = 1.0; pix.g = 0.0; pix.b = 0.0; 
    pix.a = 1.0; 
    return pix; 
} 

Cảm ơn trước sự giúp đỡ của bạn.

Trả lời

0

Bạn chỉ cần một dòng mã để tạo ra và hiển thị một biểu đồ khi sử dụng một bộ lọc tùy chỉnh lõi hình ảnh (hoặc bất cứ khi nào bạn đang tạo một đối tượng CIImage mới hoặc được thay thế hiện có):

return [CIFilter filterWithName:@"CIHistogramDisplayFilter" keysAndValues:kCIInputImageKey, self.inputImage, @"inputHeight", @100.0, @"inputHighLimit", @1.0, @"inputLowLimit", @0.0, nil].outputImage; 
Các vấn đề liên quan