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

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

昨日の続きです．

https://qiita.com/STrizzle-Naoki/items/4430fb4bfaa0cf40162f

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


> [vImageHistogramCalculation_Planar8(_:_:_:)]("https://developer.apple.com/documentation/accelerate/1544353-vimagehistogramcalculation_plana")
> Calculates the histogram of a Planar8 image.



```Swift
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
を実装していきます．

```swift
    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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465632/bcec513b-dac4-871f-b86d-7d0741400b02.png)
・カラー画像
![スクリーンショット 2021-05-10 22.07.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1465632/d2c5f034-d675-3a53-2530-5e7470974dd9.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]
```

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

それではまた