LoginSignup
0
1

More than 1 year has passed since last update.

画像のヒストグラムを作る(2) (モノクローム画像編)

Posted at

画像のヒストグラムを作る(2) (グレイスケール)

昨日の続きです.

昨日使用したvImageHistogramCalculation_ARGB8888ですが,Appleのレファレンスを参照すると,Planar8用のメソッドがあったので,今日はこれを使用してグレイスケール画像のヒストグラムを作成します.

vImageHistogramCalculation_Planar8(::_:)
Calculates the histogram of a Planar8 image.

func vImageHistogramCalculation_Planar8(_ src: UnsafePointer<vImage_Buffer>, 
                                      _ histogram: UnsafeMutablePointer<vImagePixelCount>, 
                                      _ flags: vImage_Flags) -> vImage_Error

他にも複数メソッドが用意されていますので覚書しておきます

画像形式 意味
ARGB8888 各チャネル8bitの32bit形式
ARGBFFFF 各チャネル32bitの128bit形式
Planar8 モノクローム画像 8bit
PlanarF モノクローム画像 32bit

CT画像など,医療用画像は16bitモノクロ画像のことが多いですし,
デジカメRAWデータも14か16bitのことが多いでしょう.
試してないですが,おそらく上記で応用可能かなと思います.

実装

基本的には先日紹介したものと同様ですが,新たに
 vImageHistogramCalculation_Planar8
を実装していきます.

    func histogramCalculationGray(imageRef: CGImage) ->  [UInt]
    {
        let imgProvider: CGDataProvider = imageRef.dataProvider!
        let imgBitmapData: CFData = imgProvider.data!

        var imgBuffer = vImage_Buffer(
            data: UnsafeMutableRawPointer(mutating: CFDataGetBytePtr(imgBitmapData)),
            height: vImagePixelCount(imageRef.height),
            width: vImagePixelCount(imageRef.width),
            rowBytes: imageRef.bytesPerRow)

        print(imageRef.bytesPerRow)

        var histogramBinZero = [vImagePixelCount](repeating: 0, count: 256)

        histogramBinZero.withUnsafeMutableBufferPointer { zeroPtr in
            let error = vImageHistogramCalculation_Planar8(&imgBuffer, zeroPtr.baseAddress!, vImage_Flags(kvImageNoFlags))
            guard error == kvImageNoError else {
                fatalError("Error calculating histogram: \(error)")
            }
        }

        return histogramBinZero
    }

当然,Binは1種類ですので戻り値も変更しています.

結果

・モノクローム画像
スクリーンショット 2021-05-10 22.07.58.png
・カラー画像
スクリーンショット 2021-05-10 22.07.36.png

cgImageからbyteDataへ変換して画素値0〜255までの出現回数が一致しているか確認しましたが問題なさそうです.

[3942, 4536, 6772, 9034, 12216, 16272, 20350, 25557, 30674, 36847, 43879, 51445, 60626, 70644, 79406, 89252, 97990, 106718, 114065, 119935, 126283, 130721, 137958, 142371, 145576, 144142, 139682, 133093, 127644, 121993, 117684, 112832, 108841, 104749, 101299, 98299, 96062, 95825, 93493, 91719, 90269, 88754, 88589, 88997, 89898, 90216, 90405, 89903, 90554, 89603, 89594, 89733, 89547, 89444, 88773, 88341, 87894, 87264, 86499, 85897, 84229, 83563, 82034, 81003, 80204, 79277, 78279, 77188, 75882, 75278, 73916, 73093, 71253, 71049, 69666, 67883, 67431, 66362, 65405, 64184, 62829, 62058, 61442, 59497, 58896, 57886, 56992, 56064, 55016, 53887, 53041, 52341, 51795, 51136, 50304, 49501, 49197, 48071, 47541, 47106, 46100, 45821, 45690, 44588, 44138, 43905, 43381, 42800, 42539, 41936, 41312, 41081, 40262, 40005, 39713, 39020, 38961, 38005, 38031, 37683, 37374, 36740, 36475, 36376, 35963, 35530, 35358, 34928, 34876, 34686, 34001, 33594, 33384, 33099, 32879, 32868, 32671, 32394, 32003, 31868, 31655, 31540, 30997, 30705, 30699, 30429, 30409, 29985, 29633, 29318, 29122, 28992, 29145, 28793, 28490, 28281, 27892, 27813, 27500, 27563, 27350, 27492, 27138, 27136, 26519, 26781, 26730, 26510, 26284, 26254, 26110, 25714, 25990, 25580, 25847, 25389, 25456, 25248, 25139, 25082, 24855, 24713, 24641, 24710, 24393, 24254, 24151, 23939, 23650, 23922, 23807, 23534, 23054, 23109, 22921, 22869, 22836, 22504, 22604, 22314, 22226, 22134, 21969, 21409, 21387, 21324, 21053, 21008, 20916, 20615, 20342, 20159, 20033, 19978, 19874, 19697, 19514, 18959, 18945, 18815, 18629, 17992, 17938, 17780, 17549, 17354, 17212, 16816, 16794, 16399, 16259, 15861, 15438, 15151, 15011, 15017, 15124, 14663, 14302, 13454, 12968, 12730, 12566, 12164, 12512, 12796, 12824, 13695, 14835, 17052, 18763, 22570, 31125, 42722, 56396, 129275]

これでひとまず,カラーとモノクロに対応できました.
今回使っていない,ARGBFFFFPlanarFもそのうち使ってみたら記事にします.

それではまた

0
1
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1