#画像のヒストグラムを作る(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種類ですので戻り値も変更しています.
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
もそのうち使ってみたら記事にします.
それではまた