タイトルにも書いた最近隣補間法(nearest neighbor)だけでなく、共1次補間法(bilinear),3次たたみ込み補間法(cubic convolution)について、わからなくて困ってます。僕が持っている本の中にはのっていないです。3種類の特徴の違いやどういうアルゴリズムで画像の拡大・縮小をしているかが知りたいです。

このQ&Aに関連する最新のQ&A

A 回答 (3件)

ちょっと引用ミスがありました。

Pの計算のための列ベクトルの要
素が全部 f(x1) になってしまっていますが、おわかりのように、
f(x1) から順に f(x4) までです。
    • good
    • 0
この回答へのお礼

 punchan_jpさん、ありがとうございました。内挿について大変勉強になったと思います。今後は教えていただいたことを役立てることにします。

 また、わからないことができたときにはよろしくお願いします。
 本当にありがとうございました。

お礼日時:-0001/11/30 00:00

3次畳み込みは使ったことがないのですが、私の教科書(*)に式が載っ


ていたので、若干修正して引用しておきます。

(*)イメージプロセッシング<画像処理標準テキストブック>
財団法人画像情報教育振興協会(http://www.cgarts.or.jp/)

目的の位置Pの座標(u,v)
x1 = 1 + (u - [u]), y1 = 1 + (v - [v])
x2 = (u - [u]), y2 = (v - [v])
x3 = 1 - (u - [u]), y3 = 1 - (v - [v])
x4 = 2 - (u - [u]), y4 = 2 - (v - [v])
([u] はガウス記号で、uを超えない最大の整数)

f(t) = sin(π*t)/(π*t)
これを3次式で近似すると
~  1-2|t|^2+|t|^3 (0≦|t|<1)
~  4-8|t|+5|t|^2-|t|^3 (1≦|t|<2)
~  0 (2≦|t|)
(|t| は t の絶対値, ^2 は2乗)

P = [f(y1) f(y2) f(y3) f(y4)] *
    |P11 P21 P31 P41| |f(x1)|
    |P12 P22 P32 P42| |f(x1)|
    |P13 P23 P33 P43| |f(x1)|
    |P14 P24 P34 P44| |f(x1)|
(フォントの関係で式がみにくいかもしれませんが、
 行ベクトルと行列と列ベクトルの積のつもりです。)

ただし、P11の座標は([u]-1,[v]-1)、P21は([u],[v]-1)、
P31は([u]+1,[v]-1)、P12は([u]-1,[v])、以下同様

という感じらしいです。平滑化だけではなく、エッジを含む画像で
の鮮鋭化の効果もあるとのことです。
    • good
    • 0

まず、画像の拡大や縮小については、特にアルゴリズムというほど


のことはありません。画像をm倍したいときには、座標(x,y)の位置
の画素の値を得るには、元の画像の(x/m,y/m)の位置の値が求まれ
ばいいのです。

しかし、x/mやy/mは整数とは限らない(つまりそこに画素があると
は限らない)ので、周囲の画像から正しい値を推定する必要があり
ます。これが内挿とか補間というものです。拡大や縮小に限らず、
画像の補正や変形にはつきものです。

最近隣補間法は、その名のとおり、目的の位置に最も近い画素の値
をそのまま使うものです。

共1次補間法は、周囲の2x2画素について、近さに比例する重みをか
けて平均をとるという方法です。

3次畳み込み補間法は、周囲の4x4画素を用いて、それらの画素を通
る3次式による曲面を構成し、目的の位置の値を求めます。

上の方ほど、高速に計算できますが画質がギザギザした感じになり、
逆に下の方ほど、計算に時間がかかりますが滑らかな画像になりま
す。

部分的には、下の参照ページに式が載っています。

参考URL:http://lips.is.kochi-u.ac.jp/image/geomcorr.html

この回答への補足

 質問に答えて戴き誠にありがとうございました。3種類の内挿の特徴の違いについてわかりました。
 punchan_jpさんから教えて戴いた「参考URL」を見てみたのですが、3次畳み込み補間法の式だけが表示されず、式についてわかりません。3次畳み込み補間法の式について教えてください。
 大変、お忙しいと思いますが、どうぞよろしくお願いします。

補足日時:2000/12/04 17:40
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q魚眼レンズの画像処理

魚眼レンズで撮影した画像って、ひずんでますよね。
これを普通に(って何が普通かと言う問題はあるけれど)直す
処理プログラムをおしえていただけませんか?

できれば、教科書的なものでなく、サンプルプログラムがあれば
うれしいんですが・・・
言語は、C以上の高級言語ならたいていわかるので
せめてポインタだけでも・・

お願いします。

Aベストアンサー

代数幾何の射影変換で多分出来ると思います
通常画像を射影変換して魚眼レンズで見たような画像に出来るので魚眼レンズの射影行列の逆行列で変換してやれば元の画像に戻るはずです

元画像をN、射影行列をA、その逆行列をA^-1とした時、
NAが魚眼レンズ画像となるので、それにA^-1をかけると
NAA^-1 = N(AA^-1)
= N1
= N
で、元画像に戻ります

サンプルプログラムは「アフィン変換」や、「射影変換」などで検索すれば出てくると思います
または3D Gameのライブラリを見ればまず載っているはずです

参考URL:http://www.microsoft.com/japan/developer/library/default.asp?URL=/japan/developer/library/jpdx6sdk/_dx_the_projection_tr

QOpenCV webカメラの歪み補正

現在「OpenCV プログラミングブック」で勉強を始めました。
こちらの本です↓
http://www.amazon.co.jp/gp/product/483992354X/ref=s9_simz_gw_s0_p14_i1?pf_rd_m=AN1VRQENFRJN5&pf_rd_s=center-1&pf_rd_r=1FXA1WZ0DZDCWB92J6T9&pf_rd_t=101&pf_rd_p=463376736&pf_rd_i=489986

この本を参考にして魚眼レンズを取り付けたwebカメラの歪み補正をやっています。
本のP287ページのwebカメラの歪みを補正するプログラムを実行させてwebカメラの映像の歪みをとることができました。

しかし、キャリブレーション手法を用いてるので、毎回チェックパターンを撮影しないと歪み補正をすることができません。

どうにかしてチェックパターンを撮影する手間を省いてwebカメラを起動した時に既に歪みがとれている状態にしたいのですがどうすればいいでしょうか?

この本を持っている人しかわからないかもしれませんが回答お願いします。

プログラムはこちらのサイトで配布されていたので貼っておきます。
書籍掲載のコード集:cv_prog.zip (2.1MB) というファイルのs411というフォルダに入っています。
http://book.mycom.co.jp/support/bookmook/opencv/

プログラム初心者なので専門用語などわかりやすくしてもらえると助かります。
わかりずらい説明になってしまいましたが、宜しくお願いします。

現在「OpenCV プログラミングブック」で勉強を始めました。
こちらの本です↓
http://www.amazon.co.jp/gp/product/483992354X/ref=s9_simz_gw_s0_p14_i1?pf_rd_m=AN1VRQENFRJN5&pf_rd_s=center-1&pf_rd_r=1FXA1WZ0DZDCWB92J6T9&pf_rd_t=101&pf_rd_p=463376736&pf_rd_i=489986

この本を参考にして魚眼レンズを取り付けたwebカメラの歪み補正をやっています。
本のP287ページのwebカメラの歪みを補正するプログラムを実行させてwebカメラの映像の歪みをとることができました。

しかし、キャリブレーショ...続きを読む

Aベストアンサー

一般的な回答になりますが、
キャリブレーションで求めた係数をファイル化して使用するしかありません
1.カメラ起動
 キャリブレーション用ファイルがない場合→2.
 キャリブレーション用ファイルがある場合→3.
2.キャリブレーションし歪み補正
 →ここでキャリブレーション用ファイルを作成、保存。
3.キャリブレーション用ファイルを元に歪み補正
となります。

ファイルの代わりにあらかじめデフォルトの係数をプログラム内部に埋め込むと方法もありますが、特定のデバイス固定になるため、
デフォルトのほかに別途上記のようにマニュアル補正を導入したほうがよいです。

Q魚眼画像について

魚眼レンズで得られた周囲180の円形画像について展開方法を教えてください。

このように
http://www.hh.iij4u.or.jp/~jun2/EnjoyFisheyeLens/EnjoyFisheyeLens002.html
経度にそって展開する方法

原理或いはそれを紹介するホームページいただいても幸いです。

よろしくお願いします。

Aベストアンサー

>地図を作る方向と同じのことがわかったので、現在円筒図法とメルトカル図法を検討中、もし目標画像と同じような画像できたら報告します。

メルカトル図法いいですね。
正距円筒を、どのように縦に伸ばしているのかは存じませんが、我々が地図として見ているものの多くはメルカトル図法ですよね。

興味がある人もいると思うので、トランスフォームの式を載せて頂けると嬉しいです。

QOpenCV でのROIの指定方法について

いつもお世話になっております.
OpenCVに関する質問です.
FastFeatureDetectorやGoodFeaturesToTrackDetector等の特徴点検出器を入力画像の特定の部分に対して行うために,入力画像に対してROIを設定したのですが上手くいかない場合があって困っています.

たとえば,
入力画像(640*480)に対して,
左上(0,0)右下(640,480)や左上(0,0)右下(320,240)を矩形領域を指定すれば上手くいくのですが,
左上(10,10)右下(640,480)や左上(320,240)右下(640,480)だと,結果がズレてしまいます.

下記のソースコードで
---------------------------------------------------------------
cv::Rect* roi = new cv::Rect(roi_x, roi_y, roi_w, roi_h);
cv::Mat* InuptImage = new cv::Mat(640, 480, CV_8UC1, data);//dataはbyte型
InuptImage = new cv::Mat(*InuptImage, *roi);
---------------------------------------------------------------
(roi_x, roi_y, roi_w, roi_y)が
(0, 0, 640, 480)や(0, 0, 320, 240)の場合は上手くいくのですが,
(10, 10, 630, 470)や(320, 240, 320, 240)の場合には,特徴点の位置がずれたり,全体的に縮小されたりします.

どこに問題があるのでしょうか?

OpenCVは2.3で,言語はC++です.
アドバイス宜しくお願い致します.

いつもお世話になっております.
OpenCVに関する質問です.
FastFeatureDetectorやGoodFeaturesToTrackDetector等の特徴点検出器を入力画像の特定の部分に対して行うために,入力画像に対してROIを設定したのですが上手くいかない場合があって困っています.

たとえば,
入力画像(640*480)に対して,
左上(0,0)右下(640,480)や左上(0,0)右下(320,240)を矩形領域を指定すれば上手くいくのですが,
左上(10,10)右下(640,480)や左上(320,240)右下(640,480)だと,結果がズレてしまいます.

下記のソースコードで
---...続きを読む

Aベストアンサー

オフセットは必ず必要です。ROIを指定する前の画像の全体のサイズと、本来の画像の左上から、ROIの左上の座標のオフセットは、locateROI メソッドで取得することができます。

実際には、オフセットを考慮して点群座標を変換するか、特徴点を描画したい場合などでは、元の画像ではなく ROI で切り取った画像に対して描画を行います。


参考まで。



// okwave01.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <opencv2/opencv.hpp>

int main(int argc, char argv[])
{
const std::string FILE_PATH("lena.jpg");
//sample.bmpは640*480のRGBの画像

cv::Mat rgb_img = cv::imread(FILE_PATH);
// 画像読み込み

cv::Mat gray_img;
cv::cvtColor(rgb_img, gray_img, CV_BGR2GRAY);
// グレースケール画像に変換

const cv::Point ROI_TL(rgb_img.rows * 0.25, rgb_img.cols * 0.25);
const cv::Rect RECT(
rgb_img.rows * 0.25, rgb_img.cols * 0.25,
rgb_img.rows * 0.5, rgb_img.cols * 0.5);
// 中心 だけを切り取る ROI を作成。

cv::Mat rgbimage_roi = rgb_img(RECT);
cv::Mat grayimage_roi = gray_img(RECT);
// ROI による切り取り。


std::vector<cv::KeyPoint> corners;
// FAST 頂点座標の保存用変数

cv::FAST(grayimage_roi, corners, 10, true);

for (auto it = corners.begin(); it != corners.end(); ++it) {
cv::circle(grayimage_roi, it->pt, 1, cv::Scalar(255), 2);
// ROI を通してグレイスケール画像に書き込む

cv::circle(rgb_img, ROI_TL + cv::Point2i(it->pt), 1, cv::Scalar(0, 0xff, 0), 2);
// オフセットを考慮して直接RGB画像に書き込む
}

cv::imshow("RGB IMAGE", rgb_img);
cv::imshow("GRAY IMAGE", gray_img);
return cv::waitKey();
}

オフセットは必ず必要です。ROIを指定する前の画像の全体のサイズと、本来の画像の左上から、ROIの左上の座標のオフセットは、locateROI メソッドで取得することができます。

実際には、オフセットを考慮して点群座標を変換するか、特徴点を描画したい場合などでは、元の画像ではなく ROI で切り取った画像に対して描画を行います。


参考まで。



// okwave01.cpp : コンソール アプリケーションのエントリ ポイントを定義します。
//

#include "stdafx.h"
#include <opencv2/opencv.hpp>

int main(int argc...続きを読む

Q透視投影された平面を正面から見たように変換したい

透視投影で撮影された平面を、正面から撮影したように投影変換する処理を教えてください。
または、射影ひずみの補正といわれるものでしょうか?
私なりにいろいろと調べまして、
「画像の平面内の四頂点の座標を求めることができれば、平面の傾きを求めることができる。」
というところまでたどり着きまして、平面の角度を求めるところまではいきました。
しかし、その後の行列変換がわかりません。
単に回転であれば、

1    0    0
0 cosθ -sinθ
0 sinθ cosθ


cosθ 0 sinθ
0   1    0
-sinθ 0 cosθ

をかければよいかと思っていましたが、奥行きの収縮などの関係がわかりません。
どの様な行列をかければ求めることができるのか教えてください。
このような研究をしていますが、行列は苦手なので、簡単な質問でしたらすみません。

Aベストアンサー

アフィン変換と透視投影の座標変換は以下のURLに詳しく載っていると思いますので、勉強してください。
中に座標変換の式も載っていると思います。
アフィン変換や透視投影の理解に役立つようにイメージ図のあるHPも余分にあげておきました。参考になるかと思います。

アフィン変換と透視投影
http://nis-lab.is.s.u-tokyo.ac.jp/nis/CG/cgtxt/index2.htm
http://www.geocities.co.jp/Hollywood/5174/td.html
http://www-antenna.ee.titech.ac.jp/~hira/hobby/edu/afin_trans/math_html/index.html
http://hawk.ise.chuo-u.ac.jp/makino-lab/person/itot/cg2003/cg-lecture5.pdf
http://kawanobe.rs.sanno.ac.jp/~matsunaga_y/rinkou2.pdf
http://navi.cs.kumamoto-u.ac.jp/lecture/computergrahics/2007/8.pdf

プログラムでの座標変換
http://www.saturn.dti.ne.jp/~npaka/xna/PrimitiveEx/index.html

アフィン変換と透視投影の座標変換は以下のURLに詳しく載っていると思いますので、勉強してください。
中に座標変換の式も載っていると思います。
アフィン変換や透視投影の理解に役立つようにイメージ図のあるHPも余分にあげておきました。参考になるかと思います。

アフィン変換と透視投影
http://nis-lab.is.s.u-tokyo.ac.jp/nis/CG/cgtxt/index2.htm
http://www.geocities.co.jp/Hollywood/5174/td.html
http://www-antenna.ee.titech.ac.jp/~hira/hobby/edu/afin_trans/math_html/index.html
http:/...続きを読む

Q魚眼レンズの写真を広角レンズ写真に戻すソフト。

キャノンユーザーですが、次のレンズは魚眼レンズを購入しようと思っています。
ニコンには「Nikon Capture」というソフトで魚眼の歪みを補正できるとしりました。
これなら、魚眼と超広角の両方が一度に味わえると考えています。
お聞きしたいのは
1.キャノンにもこの様なソフトがあるのですか?
2.「Nikon Capture」を手に入れる事はできるのです   か?(できれば無料で・・・)
3.実際使われた方の情報知りたいです。
どうかよろしくお願いします。

Aベストアンサー

#2,3です。PaintoShopProシリーズを愛用しています。まだ締めていないので書かせてもらいますね。

#4さん御紹介のバージョンは少し前まで1万円以上していましたので非常にお得です。現在のバージョンとも機能的に遜色ありません。

こちらで試した結果を報告させてもらいます。(名称が多少異なるかもしれません)
1.「魚眼型ひずみの補正」で円形の歪みが解消できます。
2.「遠近補正ツール」で垂直方向の歪みが解消できます。
以上の2段階で変換できました。

Q同次変換 アフィン変換

同次変換 アフィン変換


現在、座標変換について勉強しています。

そこで、同次変換とアフィン変換の違いがわかりません。
両者は同じではないのでしょうか?

また、射影変換と透視変換も同じように思います。
両者に違いはあるのでしょうか?

たくさんの名前がついた変換が存在していて難しいです。

ご回答何卒よろしくお願い致します。

Aベストアンサー

以前グーグルのストリートビューを例に回答した者です。
そのときはちょっと回答が中途半端になってしまいました。。。

まず、「変換」という言葉から説明します。変換とは、
ある空間から同じ空間への写像のうち、その空間の構造を保つもののことです。
空間の構造とは、空間に備わっている概念(性質)のことで、
「直線」「平行」「長さの比」「長さ」「角度」「原点」などがあります。
(変換を考えるときには、さらに全単射に限定しているときが多いです。)

たとえば、ユークリッド変換はユークリッド空間の構造を保つ変換ですが、
ユークリッド空間は長さや角度の概念を考える空間なので、
ユークリッド変換によって変換される前と後の図形では、
対応する部分の長さや角度が等しくなります。
たとえば、正方形はユークリッド空間により必ず同じ大きさの正方形に変換されます。
つまり変換前後の図形は互いに合同となるので、別名、合同変換とも呼ばれます。
もちろん、ユークリッド空間の中でも、合同に移さない変換を考えることはできます。
ただ、それはユークリッド変換と呼ばれないだけのことです。

このような観点で数学的に明確に定義されている変換として、
射影変換、アフィン変換、ユークリッド変換があります。
この3者の関係は、射影変換の特殊なものがアフィン変換、
アフィン変換のさらに特殊なものがユークリッド変換となります。
つまり、この中ではユークリッド変換が一番多くの性質を保ちます。

この3つの変換の対象となる空間は、
言うまでもなく射影空間、アフィン空間、ユークリッド空間です。
この3つの空間は「直線」という構造を持つという点で共通しています。
変換前後で直線が曲線になったりする変換は許されません。

一方、この3つの空間は「原点」という構造を持たないという点でも共通しています。
あれ、ユークリッド空間には原点があるんじゃないの?と思われるかもしれません。
これは座標系の原点であって、自由に選べるものです。本質的には原点はありません。
原点を持たないということは、変換前後で特定の一点を保存(固定)しなくてもよい、
つまり、全ての点がずれてしまうような変換が許されるということです。
特に、ユークリッド変換においては、このような変換を「並進」とか「平行移動」
と呼んでいます。

さて、「同次変換」という言葉は、CGとかロボットの文献でしか見かけませんが、
上のような数学的な変換の種類を指すものではなく、もっと形式的なものだと思います。

2次元ユークリッド変換は、並進、回転、鏡映の3つの要素の合成でできています。
このうち回転と鏡映だけは2次の正方行列で書けますが、並進だけは無理です。
なぜならば、一般に正方行列による線型変換 f は線型性によりf(0)=0となるものであり、
変換前後で常に保存される点ができてしまい、全ての点をずらせないからです。

ここで、並進も含めてなんとか行列を使って表現できないかと考えだされたのが、
「n個の成分を持つn次元空間の座標を、(n+1)次の正方行列を使って変換する」
というアイディアです。同次変換とはこのように1次元多い行列で表現された変換を
形式的にさす言葉のようです。ですから、射影変換、アフィン変換、ユークリッド変換
に関わらず用いられます。逆に、同じ変換でも成分ごとにバラして書き下した場合は
敢えて同次変換とは呼ばれないように思います。

ちなみに、射影変換はそもそもが1次元多い行列で定義されるものであるので、
これの特殊バージョンであるアフィン変換やユークリッド変換が
同じく1次元多い行列で表現できるのは当然のことなのです。
「同次(斉次)」とはどういう意味か、も含めて、このあたりはもう一つされている
質問にも関連してきますので、時間があればそちらで回答したいと思います。

以前グーグルのストリートビューを例に回答した者です。
そのときはちょっと回答が中途半端になってしまいました。。。

まず、「変換」という言葉から説明します。変換とは、
ある空間から同じ空間への写像のうち、その空間の構造を保つもののことです。
空間の構造とは、空間に備わっている概念(性質)のことで、
「直線」「平行」「長さの比」「長さ」「角度」「原点」などがあります。
(変換を考えるときには、さらに全単射に限定しているときが多いです。)

たとえば、ユークリッド変換はユークリッド空間...続きを読む

Q加重平均と平均の違い

加重平均と平均の違いってなんですか?
値が同じになることが多いような気がするんですけど・・・
わかりやす~い例で教えてください。

Aベストアンサー

例えば,テストをやって,A組の平均点80点,B組70点,C組60点だったとします.
全体の平均は70点!・・・これが単純な平均ですね.
クラスごとの人数が全く同じなら問題ないし,
わずかに違う程度なら誤差も少ないです.

ところが,A組100人,B組50人,C組10人だったら?
これで「平均70点」と言われたら,A組の生徒は文句を言いますよね.
そこで,クラスごとに重みをつけ,
(80×100+70×50+60×10)÷(100+50+10)=75.6
とやって求めるのが「加重平均」です.

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Q輝度勾配

微分処理に基づく画像処理によって求められる輝度勾配について。

輝度勾配とは一体どのようなものでしょうか?
明度や濃度とは異なるのでしょうか?
色々文献を読んでいるとゴチャゴチャしてきてしまいまして(´・ω・`)

また、この輝度勾配とは一体どのような目的で使用されるのでしょうか?
よろしくお願いします。

Aベストアンサー

輝度勾配とは輝度の勾配のことですよね。
でしたら「輝度」と「勾配」が分かっていれば分かるはずなんですが…さて分からないのはどちら?

輝度
要するに明るさです。明度とはほぼ同じ概念で、流儀の違いと考えていいと思います。
http://ja.wikipedia.org/wiki/YUV#YCbCr_.2F_YPbPr

勾配
値の、座標に対する変化率。ベクトル演算で求める。デジタル画像で言えば隣ピクセルとの差分。
http://ja.wikipedia.org/wiki/%E5%8B%BE%E9%85%8D

目的は…パッと思いつくところで輪郭判定。輝度勾配の(絶対値の)大きさが大きいところが輪郭です。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報