Я пытаюсь реализовать вычисление гистограммы RGB для изображений в Swift (я новичок в iOS). Однако время вычисления для изображения 1500x1000 составляет около 66 секунд, что я считаю слишком медленным. Есть ли способы ускорить обход изображения?iOS slow image pixel iterating
P.S. текущий код заключается в следующем:
func calcHistogram(image: UIImage) {
let bins: Int = 20;
let width = Int(image.size.width);
let height = Int(image.size.height);
let binStep: Double = Double(bins-1)/255.0
var hist = Array(count:bins, repeatedValue:Array(count:bins, repeatedValue:Array(count:bins, repeatedValue:Int())))
for i in 0..<bins {
for j in 0..<bins {
for k in 0..<bins {
hist[i][j][k] = 0;
}
}
}
var pixelData = CGDataProviderCopyData(CGImageGetDataProvider(image.CGImage))
var data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
for x in 0..<width {
for y in 0..<height {
var pixelInfo: Int = ((width * y) + x) * 4
var r = Double(data[pixelInfo])
var g = Double(data[pixelInfo+1])
var b = Double(data[pixelInfo+2])
let r_bin: Int = Int(floor(r*binStep));
let g_bin: Int = Int(floor(g*binStep));
let b_bin: Int = Int(floor(b*binStep));
hist[r_bin][g_bin][b_bin] += 1;
}
}
}
Не ответ, но имея приложение iPhone рассмотреть все 1500 х 1000 пикселей не могут быть необходимыми. Вы можете нарисовать 10 000 случайных позиций из 'data' и создать из них достаточно хорошую гистограмму. –
Или сделайте свою гистограмму с уменьшенным уменьшенным изображением изображения. Или сделайте свою гистограмму на графическом процессоре, который построен для такого рода параллельных вычислений данных. Или используйте библиотеку - например, CoreImage может генерировать гистограммы для вас. – rickster
Используйте существующую реализацию. Я считаю, что библиотека CoreImage имеет функцию гистограммы. Или, если вам нужно, чтобы он был в режиме реального времени, проверьте пакет GPUImage. (Погугли это) –