Как получить значение пикселя в градациях серого для заданной точки (x, y) на изображении? - PullRequest
0 голосов
/ 28 мая 2019

Я пытался использовать приведенный ниже код для извлечения значения градаций серого, связанного с данным пикселем моего изображения.Я думал, что это работает, но потом я заметил, что мои результаты не соответствуют моему изображению.

Как я могу получить правильное значение оттенков серого для данного пикселя моего изображения в (x, y) из массива 1D, который мойФункция pixelValues ​​возвращает?

Я пытался использовать index = x * width of image + y, но это, похоже, не работает.

func pixelValues(fromCGImage imageRef: CGImage?) -> (pixelValues: [UInt16]?, width: Int, height: Int)
{
    var width = 0
    var height = 0
    var pixelValues: [UInt16]?
    if let imageRef = imageRef {
        width = imageRef.width
        height = imageRef.height
        let bitsPerComponent = imageRef.bitsPerComponent
        let bytesPerRow = imageRef.bytesPerRow
        let totalBytes = height * width

        let colorSpace = CGColorSpaceCreateDeviceGray()
        var intensities = [UInt16](repeating: 0, count: totalBytes)

        let contextRef = CGContext(data: &intensities, width: width, height: height, bitsPerComponent: bitsPerComponent, bytesPerRow: bytesPerRow, space: colorSpace, bitmapInfo: 0)
        contextRef?.draw(imageRef, in: CGRect(x: 0.0, y: 0.0, width: CGFloat(width), height: CGFloat(height)))

        pixelValues = intensities
    }

    return (pixelValues ,width, height)
}

//Returns grayscale value of image at pixel (x,y)
func getGrayValue(pixelValues: [UInt16], width: Int, x: Int, y: Int) -> UInt16 {
    let i = x*width + y
    return pixelValues[i]
}

Ответы [ 2 ]

0 голосов
/ 10 июня 2019

Ничего себе. Это не хорошо по нескольким причинам.

  1. Зачем возвращать ширину и высоту, когда они передаются в код в первую очередь? Код вызова уже имеет эту информацию.

  2. Нет необходимости преобразовывать все изображение в оттенки серого. Преобразуйте исходное изображение RGB в буфер в памяти. Байты, вероятно, будут в порядке RGBA, в зависимости от используемого метода. Тогда просто точно вычислите позицию первого байта пикселя. Тогда bytePosition обычно (xPos * 4) + (yPos * rowWidthInBytes)

Если байты находятся в последовательности RGBA, то bytePosition будет указывать на красный байт. Добавьте этот байт к следующим двум байтам, а затем разделите на 3 .... теперь у вас есть значение серого для этого пикселя. Легко как это.

0 голосов
/ 28 мая 2019

Ваш расчет

index = x * width of image +y

выключено, если вы сохраняете 2D-изображение в одномерном массиве, правильный способ доступа к значению в [x, y]:

index = x + width of image * y

...