8

openCVを介して何らかの方法で変更した画像があるとします。

ここに画像の説明を入力してください

そして今、私たちはそれにグラデーションマップを適用したいと思います(フォトショップを介して適用できるもののように)

ここに画像の説明を入力してください

では、openCVを介してグラデーションマップ(虹色)を適用する方法を知りたいですか?

4

2 に答える 2

14

Pythonを使用して偽色/疑似カラーの画像を作成する方法は次のとおりです。C++への変換は非常に簡単です。概要:

  1. 画像をグレースケール、RGBとして開きます
  2. RGB画像をHSV(色相、彩度、値/明るさ)色空間に変換します。これは円筒形の空間であり、色相は極軸上の単一の値で表されます。
  3. 色相チャネルを、すでに開いたグレースケール画像に設定します。これは重要なステップです。
  4. 値と飽和チャネルの両方を最大値に設定します。
  5. RGB空間に変換し直します(そうしないと、表示が正しくなくなります)。

ただし、いくつかの問題があります...

  1. 色相は度で保持され、カラースペクトルは0〜180(0〜256ではなく0〜360ではない(場合によっては))で表されるため、次の値を掛けてグレースケール画像を適切に再スケーリングする必要があります。180 / 256.0
  2. opencvの場合、色相のカラースケールは青から始まります(画像のように赤ではありません)。すなわち。マッピングは次のようになります。

から:ここに画像の説明を入力してくださいへ:ここに画像の説明を入力してください

これを変更することが重要な場合は、すべての色相要素をオフセットし、それらを180前後にラップすることで変更できます(そうでない場合は飽和します)。コードは、このカットオフポイントで画像をマスクしてから、適切にオフセットすることでこれを行います。120のオフセットを使用して、カラースケールを生成します。

から:ここに画像の説明を入力してくださいへ:ここに画像の説明を入力してください

この方法で処理された画像は、(最後に)あなたの画像と非常によく一致しているようです。

import cv

image_bw = cv.LoadImage("TfBmw.jpg", cv.CV_LOAD_IMAGE_GRAYSCALE)
image_rgb = cv.LoadImage("TfBmw.jpg")

#create the image arrays we require for the processing
hue=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)
sat=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)
val=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)
mask_1=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)
mask_2=cv.CreateImage((image_rgb.width,image_rgb.height), cv.IPL_DEPTH_8U, 1)

#convert to cylindrical HSV color space
cv.CvtColor(image_rgb,image_rgb,cv.CV_RGB2HSV)
#split image into component channels
cv.Split(image_rgb,hue,sat,val,None)
#rescale image_bw to degrees
cv.ConvertScale(image_bw, image_bw, 180 / 256.0)
#set the hue channel to the greyscale image
cv.Copy(image_bw,hue)
#set sat and val to maximum
cv.Set(sat, 255)
cv.Set(val, 255)

#adjust the pseudo color scaling offset, 120 matches the image you displayed
offset=120
cv.CmpS(hue,180-offset, mask_1, cv.CV_CMP_GE)
cv.CmpS(hue,180-offset, mask_2, cv.CV_CMP_LT)
cv.AddS(hue,offset-180,hue,mask_1)
cv.AddS(hue,offset,hue,mask_2)

#merge the channels back
cv.Merge(hue,sat,val,None,image_rgb)
#convert back to RGB color space, for correct display
cv.CvtColor(image_rgb,image_rgb,cv.CV_HSV2RGB)

cv.ShowImage('image', image_rgb)
# cv.SaveImage('TfBmw_120.jpg',image_rgb)
cv.WaitKey(0)

で処理された画像offset = 120

ここに画像の説明を入力してください

于 2012-04-09T07:28:11.033 に答える
4

現在、applyColorMapと呼ばれるopenCV関数が存在し、このプロセスを簡単にします。次のコードはトリックを行います

image_cm = cv2.applyColorMap(image, cv2.COLORMAP_JET))

そしてこれが結果です:

元の飛行機 図1:元の平面図2: カラーマップを適用した後の平面 カラーマップを適用した後の平面

于 2017-12-14T09:53:52.420 に答える