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

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











