【VBA×画像処理】ビットマップ画像のネガポジ反転

本ページでは、VBAで読み込んだビットマップ(BMP)画像を内部的に処理し、各ピクセルのRGB値をもとにネガポジ反転を行う方法を解説していきます。ネガポジ反転とは、画像の明るさや色を反転させる処理のことを指します。この処理は、画像の階調や特徴を強調したい場合や、画像解析の前処理として使われることもあります。シンプルで基礎的な操作ですが、画像のコントラスト理解や後続のエッジ検出・領域抽出などの処理を行う際にも役立つ重要なステップです。

 icon-warning 注意事項 

本ページではビットマップ(BMP)画像の読み込みと書き出しページで実装したクラスに画像処理を追加していきます。前提の機能となる画像の入出力機能を実装しているため事前に一読ください。

ネガポジ反転

ネガポジ反転とは、画像の色や明るさを反転させる処理のことです。具体的にはすべてのピクセルに対してRGBの各成分をそれぞれ反転する処理を行います。カラー画像の場合、各ピクセルのRGB値(それぞれ 0~255)を次の式で変換します:

\[
\begin{cases}
R’ = 255\, -\, R \\
G’ = 255\, -\, G \\
B’ = 255\, -\, B
\end{cases}
\]

このようにして、元の色を構成する3つの成分をすべて補色側に反転させます。
たとえば、赤成分が強い領域は青や緑寄りに変わり、全体の色調が反転したような印象になります。

この処理を行うことで、通常では目立たない領域の強調や、明暗・色相の分布を直感的に把握するための可視化が可能になります。また、検査画像や解析対象を見やすくするために対象を背景より明るく切り替えたい場合や、二値化やエッジ検出の結果を反転して視認性を向上させる目的でも利用されます。
 

サンプルコード

以下はネガポジ反転を行うためのコードです。事前に用意しておいたclsBitmap内に下記コードをコピペすることで利用可能になります。処理内容は全ピクセルを走査して各ピクセルのRGB値をすべて反転しているだけのシンプルな内容です。

クラスモジュール (clsBitmapに追記)

'****************************************************************************
'*  ネガポジ反転
'****************************************************************************
Public Sub NegaPosiReversal()

    Dim rgbDataOrg()    As RGBTRIPLE '元画像RGBデータ
    Dim rgbDataRev()    As RGBTRIPLE 'ネガポジ反転画像RGBデータ

    Dim lHeight     As Long
    Dim lWidth      As Long
    Dim lX          As Long
    Dim lY          As Long
    Dim lR          As Long '┐
    Dim lG          As Long '│平均値計算時のオーバーフロー回避のためLong型(本来はByte型)
    Dim lb          As Long '┘

    '元画像情報を取得
    rgbDataOrg = m_rgbImageData
    lHeight = UBound(rgbDataOrg, 1) + 1  '配列は0始まりなので+1で補正
    lWidth = UBound(rgbDataOrg, 2) + 1   '配列は0始まりなので+1で補正

    '配列サイズを定義(元画像と同じ2次元配列)
    ReDim rgbDataRev(UBound(rgbDataOrg, 1), UBound(rgbDataOrg, 2))

    'ネガポジ反転
    For lY = 0 To lHeight - 1
        For lX = 0 To lWidth - 1
            rgbDataRev(lY, lX).rgbRed = 255 - rgbDataOrg(lY, lX).rgbRed
            rgbDataRev(lY, lX).rgbGreen = 255 - rgbDataOrg(lY, lX).rgbGreen
            rgbDataRev(lY, lX).rgbBlue = 255 - rgbDataOrg(lY, lX).rgbBlue
        Next
    Next

    'RGBデータを更新
    m_rgbImageData = rgbDataRev
 
End Sub

 
 標準モジュール

Option Explicit
Sub main()

    Dim sPathBmpSrc As String
    Dim sPathBmpExport As String
    Dim oBitmap As clsBitmap

    sPathBmpSrc = "C:\...\source.bmp"
    sPathBmpExport = "C:\...\output.bmp"

    Set oBitmap = New clsBitmap
    Call oBitmap.LoadBitmap(sPathBmpSrc)        '画像読み込み
    Call oBitmap.NegaPosiReversal               'ネガポジ反転
    Call oBitmap.ExportBitmap24(sPathBmpExport) '画像出力

End Sub

使い方は非常にシンプルで上記コードのように既に用意しておいた画像の入出力処理の間に、ネガポジ反転処理を呼び出すだけです。ネガポジ反転の直前に二値化関数呼び出すことで二値化した画像をされにネガポジ反転した画像として出力が可能です。
 

関連情報

 VBA×画像処理ページ

次回 >> 画像の上下・左右反転
前回 >> 画像の二値化(白黒)
画像処理のメインページへ戻る

 参考

外部リンク:知能情報処理演習2 画像処理プログラミング (立命館大学)
                       :Implementation of Gray Level Image Transformation Techniques

Excel,VBA,画像処理