JPWO2014033867A1 - 画像変換プログラム、画像変換装置、および画像変換方法 - Google Patents

画像変換プログラム、画像変換装置、および画像変換方法 Download PDF

Info

Publication number
JPWO2014033867A1
JPWO2014033867A1 JP2014532643A JP2014532643A JPWO2014033867A1 JP WO2014033867 A1 JPWO2014033867 A1 JP WO2014033867A1 JP 2014532643 A JP2014532643 A JP 2014532643A JP 2014532643 A JP2014532643 A JP 2014532643A JP WO2014033867 A1 JPWO2014033867 A1 JP WO2014033867A1
Authority
JP
Japan
Prior art keywords
pixel
image conversion
value
image
pixels
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2014532643A
Other languages
English (en)
Other versions
JP5900625B2 (ja
Inventor
陽介 千田
陽介 千田
太郎 菊池
太郎 菊池
秀幸 小池
秀幸 小池
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Fujitsu Ltd
Original Assignee
Fujitsu Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Fujitsu Ltd filed Critical Fujitsu Ltd
Application granted granted Critical
Publication of JP5900625B2 publication Critical patent/JP5900625B2/ja
Publication of JPWO2014033867A1 publication Critical patent/JPWO2014033867A1/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T5/00Image enhancement or restoration
    • G06T5/70Denoising; Smoothing
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N25/00Circuitry of solid-state image sensors [SSIS]; Control thereof
    • H04N25/70SSIS architectures; Circuits associated therewith
    • H04N25/71Charge-coupled device [CCD] sensors; Charge-transfer registers specially adapted for CCD sensors
    • H04N25/75Circuitry for providing, modifying or processing image signals from the pixel array
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06TIMAGE DATA PROCESSING OR GENERATION, IN GENERAL
    • G06T11/002D [Two Dimensional] image generation
    • G06T11/60Editing figures and text; Combining figures or text
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N1/00Scanning, transmission or reproduction of documents or the like, e.g. facsimile transmission; Details thereof
    • H04N1/40Picture signal circuits
    • H04N1/409Edge or detail enhancement; Noise or error suppression
    • H04N1/4092Edge or detail enhancement

Landscapes

  • Engineering & Computer Science (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Theoretical Computer Science (AREA)
  • Multimedia (AREA)
  • Signal Processing (AREA)
  • Image Processing (AREA)
  • Facsimile Image Signal Circuits (AREA)

Abstract

ぼかし効果を与える処理の処理時間の減少を図る。画像変換装置(100)は、対象画素列と平行な画素列のうちの、絞り形状(101)と重なる第1の画素列として、y=7の画素列を抽出する。さらに、画像変換装置(100)は、絞り形状(101)と連続して重なる画素数が第1の画素列以上の第2の画素列として、y=4の画素列を抽出する。続けて、画像変換装置(100)は、元画像(IN)を変換した場合の第1の画素の値を記憶する記憶部を参照して、元画像(IN)を変換した場合の第2の画素の値を算出する。具体的には、画像変換装置100は、元画像(IN)を変換した場合の第1の画素の値と、拡散元画素(IN[5][2])の値と、拡散元画素(IN[5][3])との平均を、元画像(IN)を変換した場合の第2の画素の値とする。

Description

本発明は、画像変換プログラム、記録媒体、画像変換装置、および画像変換方法に関する。
従来、画像を、ぼかし効果を与えた画像に変換する技術がある。たとえば、入力画像の処理対象画素それぞれにぼかし範囲を計算し、ぼかし効果を与える処理を行う技術がある。また、サイズが異なる複数の移動平均フィルタを用いてフィルタ処理を行い、複数のぼかし画像を生成し、複数のぼかし画像データの互いに対応する各画素に関し、ぼかし画像ごとに重みを与えて、各ぼかし画像データの平均値を合成ぼかし画像とする技術がある。また、入力画像の各画素のRGB値から露光量を計算処理によって求め、各画素の露光量にぼかし効果を与える処理を行い、ぼかし効果を与えた各画素の露光量をRGB値に戻す技術がある。(たとえば、下記特許文献1〜3を参照。)
特開平06−036022号公報 特開2004−133551号公報 特開2001−216513号公報
しかしながら、上述した従来技術において、画像に対してぼかし効果を与える処理の計算量が多くなり、画像の変換処理にかかる処理時間の増加を招くという問題がある。たとえば、ぼかし効果を与える処理は、画像内の画素ごとに画素の値をぼかし範囲となる絞り形状に合わせて均等に分布する処理となるため、計算量が多くなる。
本発明は、上述した従来技術による問題点を解消するため、ぼかし効果を与える処理の処理時間の短縮を図る画像変換プログラム、記録媒体、画像変換装置、および画像変換方法を提供することを目的とする。
上述した課題を解決し、目的を達成するため、本発明の一側面によれば、変換対象となる画像の中の対象画素列と平行な画素列のうちの、対象画素列のいずれかの画素から所定範囲の画素群によって形成される領域と重なる第1の画素列と、領域と連続して重なる画素数が第1の画素列以上の第2の画素列とを抽出し、抽出した第1の画素列の中の領域に含まれる第1の画素群のうちの対象画素列の走査方向または走査方向の逆方向のいずれかの方向にある端の画素から第1の画素群に含まれる第1の画素までの画素数を取得し、抽出した第2の画素列の中の領域に含まれる第2の画素群のうちのいずれかの方向にある端の画素からいずれかの方向の逆方向に向かって、取得した画素数分先の位置にある第2の画素を特定し、画像を変換した場合の第1の画素の値を記憶する記憶部を参照して、画像を変換した場合の第2の画素の値を算出する画像変換プログラム、記録媒体、画像変換装置、および画像変換方法が提案される。
本発明の一側面によれば、ぼかし効果を与える処理の処理時間の短縮を図ることができるという効果を奏する。
図1Aは、本実施の形態にかかる画像変換装置の動作例を示す説明図(その1)である。 図1Bは、本実施の形態にかかる画像変換装置の動作例を示す説明図(その2)である。 図2は、画像変換装置のハードウェア構成例を示すブロック図である。 図3は、画像変換装置の機能構成例を示すブロック図である。 図4は、絞り形状の第1の例と絞り形状テーブルの記憶内容の第1の例を示す説明図である。 図5は、画像変換処理の動作例を示す説明図(その1)である。 図6は、画像変換処理の動作例を示す説明図(その2)である。 図7は、画像変換処理の動作例を示す説明図(その3)である。 図8は、x軸方向に走査する場合の画像変換処理手順の一例を示すフローチャートである。 図9は、x軸方向に走査する場合の初期化処理手順の一例を示すフローチャートである。 図10は、x軸方向に走査する場合の光エネルギ値変換処理手順の一例を示すフローチャートである。 図11は、x軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その1)である。 図12は、x軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その2)である。 図13は、RGB値変換処理手順の一例を示すフローチャートである。 図14は、絞り形状テーブルを用いない場合の画像変換処理の動作例を示す説明図である。 図15は、絞り形状テーブルを用いない場合の光拡散処理手順の一例を示すフローチャート(その1)である。 図16は、絞り形状テーブルを用いない場合の光拡散処理手順の一例を示すフローチャート(その2)である。 図17は、絞り形状の第2の例と絞り形状テーブルの記憶内容の第2の例を示す説明図である。 図18は、y軸方向に走査する場合の初期化処理手順の一例を示すフローチャートである。 図19は、y軸方向に走査する場合の光エネルギ値変換処理手順の一例を示すフローチャートである。 図20は、y軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その1)である。 図21は、y軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その2)である。 図22は、Y=−X方向に走査する場合の画像変換処理の動作例を示す説明図である。 図23は、Y=−X方向に走査する場合の初期化処理手順の一例を示すフローチャートである。 図24は、Y=−X方向に走査する場合の光エネルギ値変換処理手順の一例を示すフローチャートである。 図25は、Y=−X方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その1)である。 図26は、Y=−X方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その2)である。 図27は、P取得処理手順の一例を示すフローチャートである。 図28は、X・Y取得処理手順の一例を示すフローチャートである。 図29は、Ro取得処理手順の一例を示すフローチャートである。 図30は、絞り形状の第3の例と絞り形状テーブルの記憶内容の第3の例を示す説明図である。 図31は、絞り形状の第4の例と絞り形状テーブルの記憶内容の第4の例を示す説明図である。 図32は、光エネルギ値からRGB値への変換処理手順の一例を示すフローチャート(その1)である。 図33は、光エネルギ値からRGB値への変換処理手順の一例を示すフローチャート(その2)である。 図34は、本実施の形態における画像変換処理の結果の一例を示す説明図(その1)である。 図35は、本実施の形態における画像変換処理の結果の一例を示す説明図(その2)である。 図36は、画素ごとの画像変換処理と本実施の形態における画像変換処理との速度比較を示す説明図である。
以下に添付図面を参照して、開示の画像変換プログラム、記録媒体、画像変換装置、および画像変換方法の実施の形態を詳細に説明する。
図1Aは、本実施の形態にかかる画像変換装置の動作例を示す説明図(その1)である。画像変換装置100は、元画像を受け付けると、元画像にぼかし効果を与える処理を行い、ぼかし画像として変換するコンピュータである。画像変換装置100は、たとえば、スマートフォンや携帯電話等の携帯端末である。たとえば、画像変換装置100がユーザにより操作されている状態にて、画像変換装置100が、ポップアップダイアログを表示する場合を想定する。このとき、ポップアップダイアログ以外の背面をぼかし効果によりぼかすことにより、画像変換装置100は、ポップアップダイアログに注視させるという、ユーザに対する視覚的効果を与えることができる。
しかし、ぼかし効果を与える処理は、画像内の画素数と絞り形状に含まれる画素数との積に比例しており、処理量が多くなるため、処理時間がかかる。本実施の形態にかかる画像変換装置100は、ぼかし効果を与える処理の計算量を減らして、処理時間を短縮する。
以下、元画像を、ぼかし効果を与えたぼかし画像に変換する処理を、「画像変換処理」と称する。また、元画像とぼかし画像の大きさは、縦幅H[画素]、横幅W[画素]と定義する。また、元画像の符号を、INとし、ぼかし画像の符号をOUTと定義する。さらに、元画像およびぼかし画像は、直交する2次元座標にあり、水平軸をx軸とし、垂直軸をy軸とする。元画像のx=X、y=Yの画素を、IN[Y][X]として示し、変換後となるぼかし画像のx=X、y=Yの画素を、OUT[Y][X]として示す。また、IN[Y]は、元画像のy=Yの行の画素列を示し、OUT[Y]は、ぼかし画像のy=Yの行の画素列を示す。
図1Aの(A)は、絞り形状101を示している。絞り形状101は、予めユーザによって指定された絞り形状となる。指定された絞り形状101は、拡散元画素から所定範囲の画素群によって形成される領域の形状となる。絞り形状101の中央となるx=0、y=0の画素は、所定範囲の画素群に画素の値を拡散させる拡散元画素となる。画素の値は、RGB値でもよいし、RGB値を変換した露光量を表す光エネルギ値でもよい。光エネルギ値は、照度と時間をかけ合わせた値となる。
図1Aでの所定範囲の画素群は、y=2、−2の行の、−1≦x≦1を満たす画素となり、y=−1、0、1の行の、−2≦x≦2を満たす画素となる。以上から、絞り形状に含まれる画素群は、21[画素]となる。画像変換装置100の画面の画素数が、320[画素]×480[画素]である場合、画像内の画素数と絞り形状に含まれる画素数との積は、320×480×21=3225600[画素]となる。本実施の形態にかかる画像変換装置100は、ぼかし処理の計算量の減少を図る。
図1Aの(B1)〜図1Aの(B3)では、ぼかし形状と重なる画素について、どの画素が影響を与えているかを示した図である。図1Aの(B1)〜図1Aの(B3)では、画像変換装置100が、入力画像を水平方向に走査して得られる、光を拡散させる拡散元画素の対象画素列をy=5とした場合について説明する。なお、走査方向は、x軸方向でもよいし、y軸方向でもよいし、x軸方向と、y軸方向とは異なる斜め方向としてもよい。
画像変換装置100は、対象画素列と平行な画素列のうちの、絞り形状101と重なる第1の画素列として、y=7の画素列を抽出する。さらに、画像変換装置100は、絞り形状101と連続して重なる画素数が第1の画素列以上の第2の画素列として、y=4の画素列を抽出する。具体的には、第1の画素列が絞り形状101と重なる画素数は、3[画素]であり、第2の画素列が絞り形状101と重なる画素数は、5[画素]となる。以下、走査方向における画素列が、絞り形状101と重なる画素数を「ぶれ量」と呼称する。
図1Aの(B1)にて、対象画素列のうち拡散元画素をIN[5][6]とした場合、画像変換装置100は、y=7の画素列のうち、第1の画素として、IN[7][5]を選択する。さらに、画像変換装置100は、y=4の画素列のうち、第2の画素として、IN[4][4]を特定する。第1の画素と第2の画素の位置関係は、絞り形状と重なる領域での相対位置が同一となっている。より詳細には、y=7が絞り形状101と重なる第1の画素群のうち、IN[7][5]は、走査方向の逆方向から数えると、0番目に位置する。同様に、y=4が絞り形状101と重なる第2の画素群のうち、IN[4][4]は、走査方向の逆方向から数えると、0番目に位置する。領域での相対位置は、走査方向から見てもよい。第1の画素、第2の画素ともに絞り形状101に含まれているため、第1の画素、第2の画素は、拡散元画素IN[5][6]の影響を受ける。
次に、図1Aの(B2)にて、対象画素列のうち拡散元画素をIN[5][4]とした場合も、第1の画素、第2の画素ともに絞り形状101に含まれているため、第1の画素と第2の画素は、拡散元画素IN[5][4]の影響を受ける。なお、図示していないが、対象画素列のうち拡散元画素をIN[5][5]とした場合も、第1の画素、第2の画素ともに絞り形状101に含まれているため、第1の画素、第2の画素は、拡散元画素IN[5][5]の影響を受ける。
続けて、図1Aの(B3)にて、対象画素列のうち拡散元画素をIN[5][2]とした場合、第2の画素は絞り形状101に含まれるため、第2の画素は、拡散元画素IN[5][2]の影響を受ける。しかし、第1の画素は、絞り形状101に含まれないため、第1の画素は、拡散元画素IN[5][2]の影響を受けない。なお、図示していないが、対象画素列のうち拡散元画素をIN[5][3]とした場合も、第2の画素は絞り形状101に含まれるため、第2の画素は、拡散元画素IN[5][3]の影響を受ける。しかし、第1の画素は、絞り形状101に含まれないため、第1の画素は、拡散元画素IN[5][3]の影響を受けない。
以上より、第1の画素は、拡散元画素IN[5][4]〜拡散元画素IN[5][6]の影響を受けることとなる。また、第2の画素は、拡散元画素IN[5][2]〜拡散元画素IN[5][6]の影響を受けることとなる。したがって、第1の画素と第2の画素は、影響を与える画素が一部共通していることから、計算結果を再利用することができる。また、影響を受ける画素の数は、ぶれ量と一致する。図1の(B)にて、計算結果の再利用について説明する。
図1Bは、本実施の形態にかかる画像変換装置の動作例を示す説明図(その2)である。図1Aにて説明したとおり、第1の画素と第2の画素は、影響を与える画素が一部共通している。したがって、画像変換装置100は、元画像INを変換した場合の第1の画素の値を記憶する記憶部を参照して、元画像INを変換した場合の第2の画素の値を算出する。具体的には、画像変換装置100は、元画像INを変換した場合の第1の画素の値と、拡散元画素IN[5][2]の値と、拡散元画素IN[5][3]の値との平均を、元画像INを変換した場合の第2の画素の値とする。
元画像INを変換した場合の第1の画素の値を参照しない場合、拡散元画素IN[5][2]〜拡散元画素IN[5][6]を加算するため、画像変換装置100は、4回の加算処理を行うことになる。一方、元画像INを変換した場合の第1の画素の値を参照することにより、画像変換装置100は、2回の加算処理で済む。以降、図2〜図36を用いて、画像変換装置100の動作について詳細に説明する。
(画像変換装置100のハードウェア)
図2は、画像変換装置のハードウェア構成例を示すブロック図である。図2において、スマートフォンなどの携帯端末を想定する画像変換装置100は、CPU201と、ROM(Read Only Memory)202と、RAM(Random Access Memory)203と、フラッシュROM204と、フラッシュROMコントローラ205と、フラッシュROM206を有する。画像変換装置100は、さらに、ディスプレイ207と、I/F208と、タッチパネル209を有する。各部は、それぞれバス210で接続されている。
ここで、CPU201は、画像変換装置100の全体の制御を司る制御装置である。ROM202は、ブートプログラムなどのプログラムを記憶している不揮発性メモリである。RAM203は、CPU201のワークエリアとして使用される揮発性メモリである。フラッシュROM204は、書き換え可能な不揮発性メモリであり、たとえば、読出し速度が高速なNOR型フラッシュメモリである。フラッシュROM204は、OS(Operating System)などのシステムソフトウェアやアプリケーションソフトウェアなどを記憶している。たとえば、OSを更新する場合、画像変換装置100は、I/F208によって新しいOSを受信し、フラッシュROM204に格納されている古いOSを、受信した新しいOSに更新する。また、本実施の形態にかかる画像変換プログラムは、OSから呼ばれるシステムコールとして、フラッシュROM204内に存在していてもよい。
フラッシュROMコントローラ205は、CPU201の制御にしたがってフラッシュROM206に対するデータのリード/ライトを制御する制御装置である。フラッシュROM206は、書き換え可能な不揮発性メモリであり、たとえば、データの保存、運搬を主に目的とした、NAND型フラッシュメモリである。フラッシュROM206は、フラッシュROMコントローラ205の制御で書き込まれたデータを記憶する。データの具体例としては、画像変換装置100を使用するユーザがI/F208を通して取得した画像データ、映像データなどや、また本実施の形態にかかる画像変換プログラムを記憶してもよい。フラッシュROM206は、たとえば、メモリカード、SDカードなどを採用することができる。
ディスプレイ207は、カーソル、アイコンあるいはツールボックスを始め、文書、画像、機能情報などのデータを表示する。ディスプレイ207は、たとえば、TFT液晶ディスプレイなどを採用することができる。
I/F208は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク211に接続され、ネットワーク211を介して他の装置に接続される。そして、I/F208は、ネットワーク211と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F208には、たとえばモデムやLANアダプタなどを採用することができる。タッチパネル209は、ユーザからの接触により、データの入力を行う装置である。
(画像変換装置100の機能)
次に、画像変換装置100の機能について説明する。図3は、画像変換装置の機能構成例を示すブロック図である。画像変換装置100は、選択部301と、対象画素列取得部302と、抽出部303と、画素数取得部304と、第2の画素特定部305と、拡散元画素特定部306と、算出部307と、を含む。制御部となる選択部301〜算出部307は、記憶装置に記憶されたプログラムをCPU201が実行することにより、選択部301〜算出部307の機能を実現する。記憶装置とは、具体的には、たとえば、図2に示したROM202、RAM203、フラッシュROM204、フラッシュROM206などである。または、I/F208を経由して他のCPUが実行することにより、選択部301〜算出部307の機能を実現してもよい。
また、画像変換装置100は、絞り形状テーブル310と、一時記憶領域311にアクセス可能である。絞り形状テーブル310は、いずれかの画素から所定範囲の画素群によって形成される領域の形状と、走査方向とを関連付けて記憶する記憶領域である。一時記憶領域311は、元画像INを変換した画像OUTの画素の値を一時的に記憶する記憶領域である。絞り形状テーブル310と、一時記憶領域311は、RAM203、フラッシュROM204、フラッシュROM206といった記憶装置に格納されている。
選択部301は、絞り形状テーブル310を参照して、指定された絞り形状に応じた走査方向を選択する。絞り形状は、たとえば、ユーザにより指定される。または、開発者によって絞り形状が指定されていてもよい。絞り形状は、たとえば、6角形、ハート型、星型、など、どのような形状であってもよい。たとえば、選択部301は、ユーザにより指定された絞り形状が6角形の絞り形状であれば、絞り形状テーブル310に記憶されている走査方向としてx軸方向を選択する。なお、選択されたデータは、RAM203、フラッシュROM204、フラッシュROM206などの記憶領域に記憶される。
対象画素列取得部302は、元画像INの中から、選択部301によって選択された走査方向に走査して対象画素列を取得する。たとえば、選択部301が走査方向としてx軸方向を選択したとする。このとき、対象画素列取得部302は、元画像INの中から、x軸方向に走査して対象画素列として、y=5の画素列を選択する。対象画素列取得部302は、繰り返し対象画素列を取得してもよい。たとえば、対象画素列取得部302は、y=0の画素列から、y=H−1の画素列までを対象画素列として取得してもよい。
抽出部303は、変換対象となる画像の中の対象画素列と平行な画素列のうちの、対象画素列のいずれかの画素から所定範囲の画素群によって形成される領域と重なる第1の画素列と、領域と連続して重なる画素数が第1の画素列以上の第2の画素列とを抽出する。いずれかの画素は、画素の値の拡散元画素となる。図1の例では、拡散元画素を、IN[y=5][x=6]とする。たとえば、抽出部303は、y=5の画素列と平行な画素列のうちの、絞り形状101と重なる第1の画素列としてy=7の画素列と、絞り形状101と重なる画素数が第1の画素列以上の第2の画素列として、y=4の画素列とを抽出する。
画素数取得部304は、抽出部303によって抽出された第1の画素列の中の領域に含まれる第1の画素群のうちの対象画素列の走査方向または走査方向の逆方向のいずれかの方向にある端の画素から第1の画素群に含まれる第1の画素までの画素数を取得する。たとえば、選択部301が走査方向としてx軸方向を選択したとする。図1Aの例とすると、第1の画素群は、IN[y=7][x=5]〜IN[y=7][x=7]となる。また、第2の画素群は、IN[y=4][x=4]〜IN[y=4][x=8]となる。第1の画素は、第1の画素群のいずれであってもよい。また、第1の画素を、IN[y=7][x=5]として説明する。
また、いずれかの方向は、走査方向がx軸方向であればx軸の正の方向でもよいし、x軸の負の方向でもよい。たとえば、画素数取得部304は、第1の画素群のうちのx軸の負の方向にある端の画素IN[y=7][x=5]から、第1の画素IN[y=7][x=5]までの画素数0を取得する。なお、取得された画素数は、RAM203、フラッシュROM204、フラッシュROM206などの記憶領域に記憶される。
第2の画素特定部305は、第2の画素列の中の領域に含まれる第2の画素群のうちのいずれかの方向にある端の画素からいずれかの方向の逆方向に向かって、画素数取得部304に取得した画素数分先の位置にある第2の画素を特定する。たとえば、第2の画素特定部305は、第2の画素群のうちのx軸の負の方向にある端の画素IN[y=4][x=4]から、x軸の正の方向に向かって、画素数0分の位置にある第2の画素IN[y=4][x=4]を特定する。なお、特定された第2の画素のx座標の位置、y座標の位置は、RAM203、フラッシュROM204、フラッシュROM206などの記憶領域に記憶される。
拡散元画素特定部306は、対象画素列の中から、対象画素列に平行にいずれかの画素を移動させた場合の移動後のいずれかの画素と重なる画素を特定する。いずれかの画素を移動させる際、拡散元画素特定部306は、対象画素列に平行にいずれかの画素を移動させた移動後のいずれかの画素から所定範囲の画素群によって形成される領域内に第1の画素が含まれるように、いずれかの画素を移動させる。たとえば、拡散元画素特定部306は、対象画素列となるy=5の中から、絞り形状101に第1の画素IN[y=4][x=4]が含まれるように拡散元画素を移動させる。そして、拡散元画素特定部306は、いずれかの画素と重なった画素IN[5][4]〜画素IN[5][6]を特定する。
また、拡散元画素特定部306は、対象画素列の中から、対象画素列に平行にいずれかの画素を移動させた場合の移動後のいずれかの画素と重なる画素を特定する。いずれかの画素を移動させる際、拡散元画素特定部306は、対象画素列に平行にいずれかの画素を移動させた移動後のいずれかの画素から所定範囲の画素群によって形成される領域内に第2の画素が含まれるように、いずれかの画素を移動させる。なお、特定された画素のx座標の位置、y座標の位置は、RAM203、フラッシュROM204、フラッシュROM206などの記憶領域に記憶される。
算出部307は、画像を変換した場合の第1の画素の値を記憶する一時記憶領域311を参照して、元画像INを変換した場合の第2の画素の値を算出する。たとえば、拡散元画素特定部306は、第1の画素が含まれるようにいずれかの画素を移動させた際に特定された画素群と、第1の画素が含まれるようにいずれかの画素を移動させた際に特定された画素群とが一致したとする。この場合、算出部307は、一時記憶領域311に記憶された第1の画素の値を、元画像INを変換した場合の第2の画素の値に設定する。
また、算出部307は、拡散元画素特定部306によって特定された画素の値に基づいて、元画像INを変換した場合の第1の画素の値を算出してもよい。たとえば、算出部307は、拡散元画素IN[5][4]〜拡散元画素IN[5][6]の値を加算して、元画像INを変換した第1の画素OUT[7][5]の値を算出する。
また、算出部307は、算出部307によって算出された第1の画素の値に基づいて、画像を変換した場合の第2の画素の値を算出してもよい。また、算出部307は、元画像INを変換した場合の第1の画素の値と特定した画素の値とに基づいて、画像を変換した場合の第2の画素の値を算出してもよい。たとえば、算出部307は、第1の画素OUT[7][5]の値と、拡散元画素IN[5][2]の値と、拡散元画素IN[5][3]の値と、を加算して、第2の画素OUT[4][4]の値を算出する。
また、算出部307は、対象画素列の各々の画素ごとに、いずれかの方向に向かって、各々の画素から第1の画素群の画素数分の画素までの各画素の値に基づいて、画像を変換した場合の第1の画素列に関する各々の画素の値を算出する。たとえば、算出部307は、y=5となる対象画素列の各々の画素ごとに、x軸方向の負の方向に向かって、各々の画素から、第1の画素群の画素数となる3個分の画素の値を加算して、画像を変換した場合の第1の画素列に関する各々の画素の値を算出する。
より詳細に記述すると、たとえば、算出部307は、IN[y=5][x=0]〜IN[y=5][x=2]の値の加算結果を、一時記憶領域311として、TMP[x=2]の値とする。以下、さらに、算出部307は、IN[y=5][x=1]〜IN[y=5][x=3]の値の加算結果を、TMP[x=3]の値とする。算出部307は、このような計算を、TMP[x=W−1+S]まで行う。ここで、Sは、ぶれ量の最大値とする。算出した結果は、一時記憶領域311に格納する。
算出部307は、算出した第1の画素列に関する各々の画素の値のうちの、いずれかの画素からいずれかの方向の逆方向に向かって、第1の画素群のいずれかの方向にある端の画素から第1の画素までの画素数分先の位置にある画素の値を第1の画素の値に設定する。
第1の画素群がIN[y=5][x=5]〜IN[y=5][x=7]であり、いずれかの方向がx軸の負の方向であり、第1の画素がIN[y=5][x=5]であるとする。この場合、第1の画素群のいずれかの方向にある端の画素から第1の画素までの画素数は、0となる。このとき、算出部307は、TMP[x=0]〜TMP[x=W−1+S]のうちの、いずれかの画素からIN[y=5][x=6]からx軸の正の方向に向かって、画素数0の位置にある画素TMP[x=6]の値を元画像を変換した第1の画素の値に設定する。
また、算出部307は、各々の画素ごとに、次の記載する情報に基づいて、画像を変換した場合の第2の画素列に関する各々の画素の値を算出してもよい。基づく情報は、いずれかの方向に向かって、各々の画素から第1の画素群の画素数分先の位置にある画素の次の画素から、各々の画素から第2の画素群の画素数分まで、の各画素の値と、算出した第1の画素列に関する各々の画素の値となる。
さらに、算出部307は、算出した第2の画素列に関する各々の画素の値のうちの、元画像を変換した場合の第2の画素の値を算出する。基づく情報は、いずれかの画素からいずれかの方向の逆方向に向かって、第1の画素群のいずれかの方向にある端の画素から第2の画素までの画素数分先の位置にある画素の値となる。算出した画素の値は、一時記憶領域311に格納される。次に、図4〜図16を用いて、x軸方向に走査する場合の画像変換処理について説明する。
(x軸方向に走査する例)
図4は、絞り形状の第1の例と絞り形状テーブルの記憶内容の第1の例を示す説明図である。図4の(A)では、xy平面上での絞り形状400を示している。図4に示すように、絞り形状400は、6角形となっている。図4の(A)内のwは、ぶれ量を図示している。図4の(B)には、x方向に走査する場合の、絞り形状400の具体的な数値が記されている。たとえば、y=4の行は、x=0から始まってw=1画素続いている。また、y=3の行は、x=−1から始まってw=3画素続いている。続けて、y=2の行は、x=−3から始まってw=7画素続いている。
図4の(C)は、絞り形状400の具体的数値を絞り形状テーブルに格納した場合の記憶内容の一例を示している。図4の(C)に示す絞り形状テーブル310は、レコード401−1〜レコード401−9を記憶している。また、絞り形状テーブル310は、走査方向としてx軸方向を関連付けて記憶している。絞り形状テーブル310は、x、y、wという3つのフィールドを含む。xフィールドには、絞り形状400の該当のy行におけるぶれ開始位置となる左端の画素のx行における位置が格納される。yフィールドには、該当のy行における画素の位置が格納される。wフィールドには、ぶれ量となる該当のy行における左端から右端までの画素数が格納される。また、絞り形状テーブル310は、wの小さい順に格納されている。
たとえば、レコード401−1は、y=4の行について、x=0から始まって1画素続いていることを示している。次に、図5〜図7を用いて、画像変換処理の動作例を説明する。
図5は、画像変換処理の動作例を示す説明図(その1)である。図5では、元画像のある画素が、変換後の画素群のうちのどの画素に影響を与えているかを説明した図である。たとえば、図5の例では、IN[0]〜IN[H−1]のうちの、処理対象行となるIN[Y]の各画素が影響を与える画素について説明する。
IN[Y][X]は、OUT[Y+4][X]に影響を与える。同様に、IN[Y][X+1]は、OUT[Y+4][X+1]に影響を与え、IN[Y][X+2]は、OUT[Y+4][X+2]に影響を与える。このように、OUT[Y+4]は、IN[Y]そのものを追加すればよい。OUT[Y−4]も同様に、IN[Y]そのものを追加すればよい。また、図5に示す「±」は、符号のみが異なる2つの値を省略して記載する記号である。また、「+=」は、右辺と左辺の加算を行い、加算結果を右辺に格納する演算子である。
また、IN[Y][X]は、OUT[Y+3][X−1]、OUT[Y+3][X]、OUT[Y+3][X+1]という3つの画素に影響を与える。同様に、IN[Y][X−1]は、OUT[Y+3][X−2]、OUT[Y+3][X−1]、OUT[Y+3][X]という3つの画素に影響を与える。同様に、IN[Y][X+1]は、OUT[Y+3][X]、OUT[Y+3][X+1]、OUT[Y+3][X+2]という3つの画素に影響を与える。
このように、OUT[Y+3][X]は、IN[Y][X−1]、IN[Y][X]、IN[Y][X+1]、という3つの画素から影響を受ける。0からW−1内の間の値をとるiを用いて一般化すると、画素OUT[Y+3][i]は、IN[Y][i−1]、IN[Y][i]、IN[Y][i+1]、という3つの画素から影響を受ける。したがって、OUT[Y+3]は、ぶれ量が3であり、IN[Y]の幅3の移動平均を追加すればよい。移動平均の生成方法については、図6にて後述する。同様に、OUT[Y−3]も、IN[Y]の幅3の移動平均を追加すればよい。同様に、OUT[Y±2]、OUT[Y±1]、OUT[Y]は、IN[Y]の幅7の移動平均を追加すればよい。
図6は、画像変換処理の動作例を示す説明図(その2)である。図6では、IN[Y]を処理対象として、一時記憶領域311となるTMPに処理結果を格納する際の移動平均の生成方法を示している。
図6の(A)では、幅1の移動平均を示している。幅1の移動平均は、元データと同一となる。たとえば、0からW−1内の間の値をとるiを用いると、TMP[i]は、IN[Y][i]の値が格納されている。次に、図6の(B)では、幅2の移動平均を示している。画像変換装置100は、幅1の移動平均を格納したTMPに、元画像の対象の行内にある次の画素の値を追加して、幅2の移動平均を生成する。たとえば、画像変換装置100は、幅1の移動平均を格納したTMP[i+1]に、IN[Y][i]の値を追加する。続けて、図6の(C)では、幅3の移動平均を示している。たとえば、画像変換装置100は、幅2の移動平均を格納したTMP[i+2]に、IN[Y][i]の値を追加する。
結果、TMP[i+2]は、IN[Y][i]、IN[Y][i+1]、IN[Y][i+2]という3つの画素の平均値となる。同様に、TMP[i+1]は、IN[Y][i−1]、IN[Y][i]、IN[Y][i+1]という3つの画素の平均値となり、TMP[i]は、IN[Y][i−2]、IN[Y][i−1]、IN[Y][i]という3つの画素の平均値となる。
同様に、画像変換装置100は、幅4、幅5、幅6、幅7の移動平均を生成する。このように、幅の大きい移動平均は、幅の小さい移動平均を用いて求めることができる。また、幅の小さい移動平均を用いて幅の大きい移動平均を求めた時の計算量は、画素の値を順に追加していった時の計算量より少なくすることができる。たとえば、幅7の移動平均は、既に幅3の移動平均を生成していれば、4回の計算で済む。
以上より、図6で説明した移動平均について、TMP[i]は、IN[Y][i−2]、IN[Y][i−1]、IN[Y][i]という3つの画素の平均値となる。このように、図6で求めたTMP[i]は、x座標が同一の画素の値と、x軸の負の方向にある隣の画素と、さらに隣の画素との平均値となっている。図6で説明した移動平均では、移動平均の処理を単純化するために、移動平均の幅が大きくなる都度、x軸の正の方向にある隣の画素を次々に追加している。x軸の正の方向にある隣の画素を次々に追加する処理は、正の方向にある隣の画素を追加し、次は負の方向にある隣の画素を追加し、という処理に比べて、処理内容が単純となる。
しかし、図5では、画素OUT[Y+3][i]は、IN[Y][i−1]、IN[Y][i]、IN[Y][i+1]、という、x座標が同一の画素の値と、同一の画素のx軸方向の両隣の画素の移動平均を追加するということを説明している。このように、画素OUT[Y+3][i]に影響を与える画素とTMP[i]に影響を与える画素が図5と図6でずれている。辻褄を合わせるため、画像変換装置100は、TMPを画素OUT[Y+3]に追加する場合、TMPをずらして追加する。TMPの追加の動作例を、図7にて説明する。
図7は、画像変換処理の動作例を示す説明図(その3)である。図7では、幅3の移動平均TMPを追加する際の例を示す。画像変換装置100は、絞り形状テーブル310の幅3となるレコード401−3を参照して、TMPの各画素の値を、OUT[Y+3]に追加する。このとき、画像変換装置100は、TMPを、レコード401−3のxフィールドの値となる−1画素分オフセットして、OUT[Y+3]に追加する。たとえば、画像変換装置100は、OUT[Y+3][i]に、TMP[i+1]の値を追加する。図6の説明より、TMP[i+1]は、IN[Y][i−1]、IN[Y][i]、IN[Y][i+1]という3つの画素の平均値であったため、図5にて説明した移動平均を追加することができたことになる。
続けて、画像変換装置100は、TMPの各画素の値を、OUT[Y−3]にも追加する。このように、画像変換装置100は、ある幅の移動平均を追加する行が複数ある場合、ある幅の移動平均の結果を複数の行に追加することになるため、画素ごとに影響を与える画素を追加していく方法より計算量を少なくすることできる。次に、図8〜図13を用いて、図5〜図7にて説明した動作を行うフローチャートについて説明する。
図8は、x軸方向に走査する場合の画像変換処理手順の一例を示すフローチャートである。画像変換処理は、元画像をぼかし画像に変換する処理である。始めに、画像変換装置100は、絞り形状テーブル310を参照して、指定された絞り形状に応じた走査方向を選択する(ステップS801)。続けて、画像変換装置100は、初期化処理を実行する(ステップS802)。初期化処理は、走査方向に応じて処理内容の一部が変化する。x軸方向に走査する場合の初期化処理の詳細については、図9にて説明する。
次に、画像変換装置100は、1走査線に対する、光エネルギ値変換処理を実行する(ステップS803)。光エネルギ値変換処理は、走査方向によって処理内容が異なる。x軸方向に走査する場合の光エネルギ値変換処理の詳細については、図10にて説明する。
次に、画像変換装置100は、1走査線に対する、光拡散処理を実行する(ステップS804)。光拡散処理は、走査方向によって処理内容が異なる。x軸方向に走査する場合の光拡散処理の詳細については、図11、図12にて説明する。
続けて、画像変換装置100は、全ての走査線に対して処理したか否かを判断する(ステップS805)。ステップS805の具体的な処理は、走査方向によって異なる。具体的な処理内容は、それぞれ図12、図21、図26にて説明する。まだ処理していない走査線がある場合(ステップS805:No)、画像変換装置100は、ステップS803の処理に移行する。全ての走査線に対して処理した場合(ステップS805:Yes)、画像変換装置100は、RGB値変換処理を実行する(ステップS806)。RGB値変換処理については、図13にて説明する。
ステップS806の実行終了後、画像変換装置100は、画像変換処理を終了する。画像変換処理を実行することにより、画像変換装置100は、元画像からぼかし画像を変換することができる。
図9は、x軸方向に走査する場合の初期化処理手順の一例を示すフローチャートである。x軸方向に走査する場合の初期化処理は、x軸方向に走査する場合に、画像変換処理で用いる変数、配列、構造体を初期化する処理である。
なお、図9に示すフローチャートで用いる元画像は、グレースケールでもよいし、RGB3つの数値を持つ構造体でもよい。元画像がRGB3つの数値を持つ場合、画像変換装置100は、元画像となるINやぼかし画像となるOUTへの処理、後述する光エネルギ値ENGや一時記憶領域LINE1、LINE2への処理をRGB合わせて三回行ってもよい。
始めに、画像変換装置100は、元画像の各画素をIN[H][W]という二次元配列に格納する(ステップS901)。次に、画像変換装置100は、ぼかし画像の各画素を格納する二次元配列として、OUT[H][W]を確保する(ステップS902)。続けて、画像変換装置100は、絞り形状テーブル310の各レコードの値を、TBL[S]という構造体の配列に格納する(ステップS903)。Sは、絞り形状テーブル310のレコード数が格納された定数である。
具体的に、構造体TBLは、x、y、wという3つの要素を持つ。また、画像変換装置100は、W+TBL[S−1].wの値をW2という変数に格納する(ステップS904)。絞り形状テーブル310には、wの小さい順に格納されているため、任意の整数N(N<S)に対し常にTBL[N−1].w≦TBL[N].wが成り立つ。したがって、TBL[S−1].wは、wの最大値となる。
次に、画像変換装置100は、光エネルギ値を記憶する二次元配列ENG[H][W]を0で初期化する(ステップS905)。同様に、画像変換装置100は、各画素に光エネルギ値が追加された回数を示す二次元配列CNT[H][W]を0で初期化する(ステップS906)。続けて、画像変換装置100は、最初に処理する画素列として、Yに0を格納する(ステップS907)。ステップS907の実行終了後、画像変換装置100は、x軸方向に走査する場合の初期化処理を終了する。x軸方向に走査する場合の初期化処理を実行することにより、画像変換装置100は、画像変換処理で用いる変数、配列、構造体を初期化できる。
図10は、x軸方向に走査する場合の光エネルギ値変換処理手順の一例を示すフローチャートである。x軸方向に走査する場合の光エネルギ値変換処理は、x軸方向に走査する場合に、1走査線分となる一行分の画素の値について、RGB値から光エネルギ値に変換する処理である。
始めに、画像変換装置100は、Xを0に初期化する(ステップS1001)。次に、画像変換装置100は、IN[Y][X]の光エネルギ値を算出し、光エネルギ値を変数eに格納する(ステップS1002)。具体的な光エネルギ値の算出式として、たとえば、画像変換装置100は、下記(1)式を用いて、RGB値から光エネルギ値を算出する。
光エネルギ値=exp(IN[Y][X]/k−b) …(1)
ただし、kとbは定数である。たとえば、k=40、b=−4.5となる。expは、自然体数の底を引数でべき乗した値を返す関数である。光エネルギ値は何度も利用するため、大きさがWとなるLINE1と、大きさがW2となるLINE2という配列を確保する。具体的に、画像変換装置100は、eの値を一時記憶領域となるLINE1[X]とLINE2[X]に格納する(ステップS1003)。LINE1[X]とLINE2[X]には、幅1の移動平均が格納されたことになる。以降の処理にて、LINE2は、幅2、幅3、…、の移動平均を格納していくことになり、LINE1は、幅1の移動平均を持ち続けることになる。
続けて、画像変換装置100は、大きさW2の配列LCNTのLCNT[X]に1を格納する(ステップS1004)。LCNTは、LINE2の各要素が何回足されたかを示す変数である。次に、画像変換装置100は、Xの値をインクリメントする(ステップS1005)。続けて、画像変換装置100は、XがWより小さいか否かを判断する(ステップS1006)。XがWより小さい場合(ステップS1006:Yes)、画像変換装置100は、ステップS1002の処理に移行する。XがW以上である場合(ステップS1006:No)、LINE2とLCNTはWより大きなW2の大きさを持つため、画像変換装置100は、LINE2[X]に0を格納する(ステップS1007)。さらに、画像変換装置100は、LCNT[X]に0を格納する(ステップS1008)。
次に、画像変換装置100は、Xの値をインクリメントする(ステップS1009)。続けて、画像変換装置100は、XがW2より小さいか否かを判断する(ステップS1010)。XがW2より小さい場合(ステップS1010:Yes)、画像変換装置100は、ステップS1007の処理に移行する。XがW2以上である場合(ステップS1010:No)、画像変換装置100は、x軸方向に走査する場合の光エネルギ値変換処理を終了する。x軸方向に走査する場合の光エネルギ値変換処理を実行することにより、画像変換装置100は、1走査線分となる一行分の画素の光エネルギ値を得ることができる。
図11は、x軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その1)である。x軸方向に走査する場合の光拡散処理は、x軸方向に走査する場合に、1走査線分となる一行分の各画素の光エネルギ値を拡散していく処理である。具体的に、図11に示すフローチャートでは、移動平均を求めることにより、一行分の各画素の光エネルギ値をx軸方向に拡散する処理であり、図11に示すフローチャートでは、各画素の光エネルギ値をy軸方向に拡散する処理である。
画像変換装置100は、移動平均の幅を示すZに1を格納する(ステップS1101)。次に、画像変換装置100は、絞り形状テーブル310の処理中のレコードのインデックスを示すIに0を格納する(ステップS1102)。Iを指定することにより、画像変換装置100は、元画像INから第1の画素列を抽出することになる。ステップS1102の実行後、または後述する図12のステップS1211:Yesとなった後、画像変換装置100は、Xに0を格納する(ステップS1103)。次に、画像変換装置100は、LINE2に、追加する画素のオフセット値を示すJにZの値を格納する(ステップS1104)。
まずぶれ量が増加したかを確認するため、画像変換装置100は、JがTBL[I].wより小さいか否かを判断する(ステップS1105)。JがTBL[I].wより小さい場合(ステップS1105:Yes)、画像変換装置100は、Jの値をインクリメントする(ステップS1106)。Jの値が更新されたことにより、画像変換装置100は、X+Jで指定されるIN[Y][X+J]を、第1の画素や第2の画素に影響を与える拡散元画素として特定している。したがって、画像変換装置100は、LINE2[X+J]とLINE1[X]との加算結果を、LINE2[X+J]に格納する(ステップS1107)。続けて、画像変換装置100は、LCNT[X+J]の値をインクリメントする(ステップS1108)。次に、画像変換装置100は、ステップS1105の処理に移行する。
JがTBL[I].w以上である場合(ステップS1105:No)、画像変換装置100は、Xの値をインクリメントする(ステップS1109)。次に、画像変換装置100は、XがWより小さいか否かを判断する(ステップS1110)。XがWより小さい場合(ステップS1110:Yes)、画像変換装置100は、ステップS1104の処理に移行する。XがW以上である場合(ステップS1110:No)、画像変換装置100は、ZにTBL[I].wの値を格納する(ステップS1111)。続けて、画像変換装置100は、図12に示すステップS1201の処理に移行する。
図12は、x軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その2)である。LINE2を縦方向にどれだけオフセットして加算するかは TBL[I].y にて示されるため、画像変換装置100は、加算すべき行を示すY2に、YとTBL[I].yとの加算結果を格納する(ステップS1201)。次に、画像変換装置100は、Y2が0未満であるか、またはY2がH以上であるか否かを判断する(ステップS1202)。ステップS1202の処理は、Y2が画面内にあるかを確認する処理となる。また、図12のステップS1202で用いた「||」は、論理和を算出する演算子である。
Y2が0以上であり、かつY2がH未満である場合(ステップS1202:No)、画像変換装置100は、Xに0を格納する(ステップS1203)。次に、画像変換装置100は、参照する画素のx座標の位置を示すX2に、XとTBL[I].xの加算結果を格納する(ステップS1204)。TBL[I].xは、ぶれ開始位置となる左端の画素のx行における位置が格納されているため、画像変換装置100は、左端の画素からの画素数を取得することになる。続けて、画像変換装置100は、X2が0より小さいか、またはX2がW2以上であるか否かを判断する(ステップS1205)。ステップS1205の処理は、X2が画面内にあるかを確認する処理となる。
X2が0以上であり、かつX2がW2未満である場合(ステップS1205:No)、画像変換装置100は、ENG[Y2][X]とLINE2[X2]の加算結果を、ENG[Y2][X]に格納する(ステップS1206)。さらに、画像変換装置100は、CNT[Y2][X]とLCNT[X2]の加算結果を、CNT[Y2][X]に格納する(ステップS1207)。
ステップS1207の処理後か、Y2が0未満であるかまたはY2がH以上である場合か(ステップS1202:Yes)、X2が0より小さいかまたはX2がW2以上である場合(ステップS1205:Yes)、画像変換装置100は、Xの値をインクリメントする(ステップS1208)。続けて、画像変換装置100は、XがWより小さいか否かを判断する(ステップS1209)。XがWより小さい場合(ステップS1209:Yes)、画像変換装置100は、ステップS1204の処理に移行する。
XがW以上である場合(ステップS1209:No)、画像変換装置100は、Iの値をインクリメントする(ステップS1210)。Iの値をインクリメントすることにより、画像変換装置100は、元画像INから、絞り形状と連続して重なる画素数が第1の画素列以上の第2の画素列を抽出することになる。次に、画像変換装置100は、IがSより小さいか否かを判断する(ステップS1211)。IがSより小さい場合(ステップS1211:Yes)、画像変換装置100は、図11のステップS1103に移行する。IがS以上である場合(ステップS1211:No)、画像変換装置100は、Yの値をインクリメントする(ステップS1212)。ステップS1212の処理後、画像変換装置100は、x軸方向に走査する場合の光拡散処理を終了する。
x軸方向に走査する場合の光拡散処理の終了後、画像変換装置100は、ステップS805の処理となる、YがH未満であるか否かを判断することにより、「全ての走査線に対して処理したか」を判断する。YがH未満であれば、まだ処理していない走査線があることになり、画像変換装置100は、ステップS805:Noの処理を実行する。また、YがH以上であれば、全ての走査線に対して処理したことになり、ステップS805:Yesの処理を実行する。
x軸方向に走査する場合の光拡散処理を実行することにより、画像変換装置100は、1走査線分となる一行分の各画素の光エネルギ値を、x方向とy方向に拡散させることができる。
図13は、RGB値変換処理手順の一例を示すフローチャートである。RGB値変換処理は、光エネルギ値からRGB値に変換する処理である。なお、RGB値変換処理に至った段階にて、光エネルギ値ENGと、ENGの各要素が何回足された値かを示す情報CNTとが完成されている。
始めに、画像変換装置100は、Yに0を格納する(ステップS1301)。次に、画像変換装置100は、Xに0を格納する(ステップS1302)。次に、画像変換装置100は、ENG[Y][X]をCNT[Y][X]で除算した除算結果を、eに格納する(ステップS1303)。ステップS1303の処理により、追加された光エネルギ値の平均を求めることができる。続けて、画像変換装置100は、eのRGB値をOUT[Y][X]に格納する(ステップS1304)。具体的なRGB値の算出式として、たとえば、画像変換装置100は、下記(2)式を用いて、光エネルギ値からRGB値を算出する。
RGB値=k(b+log(e)) …(2)
ただし、kとbは、(1)式と同一の定数である。logは、引数の自然対数を返す関数である。次に、画像変換装置100は、Xの値をインクリメントする(ステップS1305)。続けて、画像変換装置100は、XがWより小さいか否かを判断する(ステップS1306)。XがWより小さい場合(ステップS1306:Yes)、画像変換装置100は、ステップS1303の処理に移行する。XがW以上である場合(ステップS1306:No)、画像変換装置100は、Yの値をインクリメントする(ステップS1307)。次に、画像変換装置100は、YがHより小さい否かを判断する(ステップS1308)。YがHより小さい場合(ステップS1308:Yes)、画像変換装置100は、ステップS1302の処理に移行する。YがH以上である場合(ステップS1308:No)、画像変換装置100は、RGB値変換処理を終了する。RGB値変換処理を実行することにより、画像変換装置100は、ぼかし画像を得ることができる。
以上、図4〜図13では、絞り形状テーブル310を用いて画像変換処理を行う例について説明している。画像変換装置100は、絞り形状テーブル310を用いずに画像変換処理を実行することもできる。以下、図14〜図16を用いて、絞り形状テーブル310を用いない場合の画像変換処理について説明する。
図14は、絞り形状テーブルを用いない場合の画像変換処理の動作例を示す説明図である。図14の(A)では、絞り形状1400が6角形となる場合の例を示している。ぶれ量wは、XとYとの関係によって求められる。絞り形状1400の一辺をSとする。したがって、wの最大値は、(√3)・Sとなる。ここで、(√x)は、xの正の平方根を示す。また、斜辺1401のxとyの関係式は、y=−(√3)/3x+Sとなり、斜辺1402のxとyの関係式は、y=(√3)/3x+Sとなる。YがS/2以上である場合、xは、−(√3)(S−y)となる。また、yが0より大きくS/2未満の場合、xは、(√3)/2・Sとなる。
図14の(B)では、ぶれ量を格納する一時記憶領域LINE1の内容を示している。d=(√3)・(S−y)とすると、wは、2d+1=1−2xの大きさとなる。LINE1[0]には、x=−dにて示す画素の値が格納される。
次に、絞り形状テーブル310を用いない場合の画像変換処理のフローチャートについて説明する。絞り形状テーブル310を用いない場合の画像変換処理は、図8〜図10、図12で示したフローチャートの部分は同一となるため、説明を省略する。したがって、図15、図16を用いて、絞り形状テーブル310を用いない場合の光拡散処理のフローチャートについて説明する。
図15は、絞り形状テーブルを用いない場合の光拡散処理手順の一例を示すフローチャート(その1)である。図15に示すステップS1510〜ステップS1513は、図11に示したステップS1106〜ステップS1109と同一の処理であるため、説明を省略する。
始めに、画像変換装置100は、移動平均の幅を示すZに1を格納する(ステップS1501)。次に、画像変換装置100は、絞り形状内の処理する対象行を示す変数Iに2Sの算出結果を格納する(ステップS1502)。Iが偶数となる場合、処理行がS/2行より上であり、Iが奇数である場合、処理行が(S+1)/2行以下を示すものとする。
ステップS1502の処理が終了した場合、または図16にて後述するステップS1611の処理が終了した場合、画像変換装置100は、Iが奇数か否かを判断する(ステップS1503)。Iが偶数である場合(ステップS1503:No)、画像変換装置100は、今の行と影響を与える行の相対位置を示す変数yにI/2の算出結果を格納する(ステップS1504)。次に、画像変換装置100は、yがS/2以下か否かを判断する(ステップS1505)。yがS/2以下である場合(ステップS1505:Yes)、画像変換装置100は、ぶれ開始位置を示すxに−(√3)(S−y)の算出結果を格納する(ステップS1506)。続けて、画像変換装置100は、ぶれ量となるwに、1−2xの算出結果を格納する(ステップS1507)。
次に、画像変換装置100は、JにZの値を格納する(ステップS1508)。続けて、画像変換装置100は、Jがwより小さいか否かを判断する(ステップS1509)。Jがwより小さい場合(ステップS1509:Yes)、画像変換装置100は、ステップS1510の処理に移行する。Jがw以上である場合(ステップS1509:No)、画像変換装置100は、ステップS1513の処理に移行する。
ステップS1513の処理終了後、画像変換装置100は、XがWより小さいか否かを判断する(ステップS1514)。XがWより小さい場合(ステップS1514:Yes)、画像変換装置100は、ステップS1508の処理に移行する。XがW以上である場合(ステップS1514:No)、画像変換装置100は、Zにwの値を格納する(ステップS1515)。Iが奇数である場合(ステップS1503:Yes)、画像変換装置100は、yに−yの値を格納する(ステップS1516)。
ステップS1515、またはステップS1516の終了後か、yがS/2以下でない場合(ステップS1505:No)、画像変換装置100は、図16に示すステップS1601の処理に移行する。
図16は、絞り形状テーブルを用いない場合の光拡散処理手順の一例を示すフローチャート(その2)である。図16に示す各ステップのうちの、ステップS1601、ステップS1604、ステップS1610、ステップS1611が、図12で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理から置き換わっている。他のステップについては図12で説明した処理と同一であるため、説明を省略する。
始めに、画像変換装置100は、Y2にYとyの加算結果を格納する(ステップS1601)。ステップS1603の処理終了後、画像変換装置100は、X2にXとxの加算結果を格納する(ステップS1604)。ステップS1609:Noとなった場合、画像変換装置100は、Iの値をデクリメントする(ステップS1610)。続けて、画像変換装置100は、Iが0以上であるか否かを判断する(ステップS1611)。Iが0以上である場合(ステップS1611:Yes)、画像変換装置100は、図15に示したステップS1503の処理に移行する。Iが0未満である場合(ステップS1611:No)、画像変換装置100は、ステップS1612の処理に移行する。
(y軸方向に走査する例)
以上、図4〜図16では、x軸方向に走査する場合の画像生成処理について説明した。画像変換装置100は、y軸方向に走査して、画像変換処理を行ってもよい。以下、図17〜図21を用いて、y軸方向に走査する場合の画像変換処理について説明する。
図17は、絞り形状の第2の例と絞り形状テーブルの記憶内容の第2の例を示す説明図である。図17の(A)では、xy平面上での絞り形状1700を示している。図17に示すように、絞り形状1700は、ハート型の形状をしている。絞り形状1700は、x軸方向に走査すると、複数の領域に分かれることになる。図17の(B)では、絞り形状1700を、x軸方向に走査する場合の絞り形状テーブル310_xの記憶内容の例を示している。絞り形状テーブル310_xは、レコード1701−1〜レコード1701−11を記憶している。また、絞り形状テーブル310_xは、走査方向としてx軸方向を関連付けて記憶している。x軸方向に走査する場合、y=3における走査線と、y=4における走査線が、複数の部分に分かれることになる。このように走査線が複数に分かれても、図8〜図13にて示したフローチャートで実行することができる。
また、図17の(C)では、絞り形状1700を、y軸方向に走査する場合の絞り形状テーブル310_yの記憶内容の例を示している。絞り形状テーブル310_yは、レコード1702−1〜レコード1702−9を記憶している。また、絞り形状テーブル310_yは、走査方向としてy軸方向を関連付けて記憶している。y軸方向に走査する場合、走査線が複数の部分に分かれることがなくなる。したがって、絞り形状テーブル310_yのレコード数は、絞り形状テーブル310_xより少なくなる。レコード数が少ないと、ループの回数が少なくなるため、処理量を減少することができる。
次に、y軸方向に走査する場合の画像変換処理のフローチャートについて説明する。y軸方向に走査する場合の画像変換処理は、図13で示したRGB値変換処理のフローチャートの部分は同一となるため、説明を省略する。以下、図18〜図21において、y軸方向に走査する場合の、初期化処理、光エネルギ値変換処理、光拡散処理について説明する。
図18は、y軸方向に走査する場合の初期化処理手順の一例を示すフローチャートである。y軸方向に走査する場合の初期化処理は、y軸方向に走査する場合に、画像変換処理で用いる変数、配列、構造体を初期化する処理である。また、図18で示すステップS1804、ステップS1807が、図9で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理から置き換わっている。他のステップについては図9で説明した処理と同一であるため、説明を省略する。
ステップS1803の処理終了後、画像変換装置100は、HとTBL[S−1].wの加算結果を、H2という変数に格納する(ステップS1804)。また、ステップS1806の処理終了後、画像変換装置100は、最初に処理する画素列として、Xに0を格納する(ステップS1807)。
図19は、y軸方向に走査する場合の光エネルギ値変換処理手順の一例を示すフローチャートである。y軸方向に走査する場合の光エネルギ値変換処理は、y軸方向に走査する場合に、1走査線分となる一列分の画素の値について、RGB値から光エネルギ値に変換する処理である。また、図19で示す各ステップのうち、ステップS1901、ステップS1903〜ステップS1910は、図10で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理の「X」が「Y」に置き換わっている。さらに、ステップS1906は、ステップS1006の「W」が「H」に置き換わっている。さらに、ステップS1910は、ステップS1010の「W2」が「H2」に置き換わっている。前述以外の変更点はないため、各ステップの説明を省略する。
図20は、y軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その1)である。y軸方向に走査する場合の光拡散処理は、y軸方向に走査する場合に、1走査線分となる一列分の各画素の光エネルギ値を拡散していく処理である。また、図20で示す各ステップのうち、ステップS2003、ステップS2007〜ステップS2010は、図11で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理の「X」が「Y」に置き換わっている。さらに、ステップS2010は、ステップS1110の「W」が「H」に置き換わっている。前述以外の変更点はないため、各ステップの説明を省略する。
図21は、y軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その2)である。図21で示す各ステップのうち、ステップS2103、ステップS2108、ステップS2109、ステップS2112は、図12で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理の「X」が「Y」に置き換わっている。さらに、ステップS2109は、ステップS1209の「W」が「H」に置き換わっている。さらに、ステップS2101、ステップS2102、ステップS2104、ステップS2105について、図12で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理から変更しているため、説明を行う。ステップS2106、ステップS2107については、ステップS1206、ステップS1207と同一の処理であるため、説明を省略する。
始めに、画像変換装置100は、X2に、XとTBL[I].xの加算結果を格納する(ステップS2101)。次に、画像変換装置100は、X2が0未満であるか、またはX2がW以上であるか否かを判断する(ステップS2102)。X2が0以上であり、かつX2がW未満である場合(ステップS2102:No)、画像変換装置100は、ステップS2103の処理に移行する。X2が0未満であるかまたはX2がW以上である場合(ステップS2102:Yes)、画像変換装置100は、ステップS2108の処理に移行する。
ステップS2103の実行終了後、画像変換装置100は、Y2に、YとTBL[I].yの加算結果を格納する(ステップS2104)。続けて、画像変換装置100は、XY2が0より小さいか、またはY2がH2以上であるか否かを判断する(ステップS2105)。Y2が0以上であり、かつY2がH2未満である場合(ステップS2105:No)、画像変換装置100は、ステップS2106の処理に移行する。また、Y2が0より小さいかまたはY2がH2以上である場合(ステップS2105:Yes)、ステップS2108の処理に移行する。
また、y軸方向に走査する場合の光拡散処理の終了後、画像変換装置100は、ステップS805の処理となる、XがW未満であるか否かを判断することにより、「全ての走査線に対して処理したか」を判断する。XがW未満であれば、まだ処理していない走査線があることになり、画像変換装置100は、ステップS805:Noの処理を実行する。また、XがW以上であれば、全ての走査線に対して処理したことになり、ステップS805:Yesの処理を実行する。
(斜め方向に走査する例)
以上、図17〜図21では、y軸方向に走査する場合の画像生成処理について説明した。画像変換装置100は、x軸やy軸方向とは斜めの走査を行って、画像変換処理を行ってもよい。以下、図22〜図29を用いて、斜め方向の一例として、Y=−X方向に走査する場合の画像変換処理について説明する。なお、図22〜図29での説明では、説明の簡略化のため、H>Wであることを前提とする。
図22は、Y=−X方向に走査する場合の画像変換処理の動作例を示す説明図である。図22の(A)は、横方向および縦方向よりY=−X方向に走査した方がよい絞り形状2200を示している。図22には図示していないが、絞り形状2200を記憶している絞り形状テーブル310は、走査方向としてY=−X方向を関連付けて記憶している。図22の(B)は、斜め方向に走査する場合の変数が示す位置を示している。Pは、現在の走査方向の画素列に含まれる画素数を示す。Qは、画素列内の対象となる画素の画素数を示す。Rは、画素列のインデックスを示している。
図22の(C)は、元画像INが、W=4、H=6とした場合の、各画素のRとQの値を示している。たとえば、IN[4][1]は、R=6であり、Q=1となる。また、画素列R=6となる画素は、IN[5][0]、IN[4][1]、IN[3][2]、IN[2][3]の4つであるから、Pは4となる。
図22の(D)は、Rと、加算すべき画素列のインデックスを示すR2と、オフセットRoの位置を示している。また、図22の(E)は、元画像INが、W=4、H=6とした場合の、R、R2、Roの関係を示している。R=3、R2=4である場合、Roは、−1となる。
次に、Y=−X方向に走査する場合の画像変換処理のフローチャートについて説明する。Y=−X方向に走査する場合の画像変換処理は、図13で示したRGB値変換処理のフローチャートの部分は同一となるため、説明を省略する。以下、図23〜図26において、Y=−X方向に走査する場合の、初期化処理、光エネルギ値変換処理、光拡散処理について説明する。
図23は、Y=−X方向に走査する場合の初期化処理手順の一例を示すフローチャートである。Y=−X方向に走査する場合の初期化処理は、Y=−X方向に走査する場合に、画像変換処理で用いる変数、配列、構造体を初期化する処理である。また、図23で示すステップS2307が、図9で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理から置き換わっている。他のステップについては図9で説明した処理と同一であるため、説明を省略する。ステップS2306の処理終了後、画像変換装置100は、Rに0を格納する(ステップS2307)。
図24は、Y=−X方向に走査する場合の光エネルギ値変換処理手順の一例を示すフローチャートである。Y=−X方向に走査する場合の光エネルギ値変換処理は、Y=−X方向に走査する場合に、1走査線分となる画素群の各画素の値について、RGB値から光エネルギ値に変換する処理である。また、図24で示す各ステップのうち、ステップS2405〜ステップS2412は、図10のステップS1003〜ステップS1010のうちの、ステップ番号の下2けたが2小さい番号の処理の「X」が「Q」に置き換わっている。さらに、ステップS2408は、ステップS1006の「W」が「P」に置き換わっている。
始めに、画像変換装置100は、Rを引数としてP取得処理を実行する(ステップS2401)。P取得処理の詳細は、図27にて後述する。次に、画像変換装置100は、Qに0を格納する(ステップS2402)。続けて、画像変換装置100は、R、Qを引数として、X・Y取得処理を実行する(ステップS2403)。
図25は、Y=−X方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その1)である。Y=−X方向に走査する場合の光拡散処理は、Y=−X方向に走査する場合に、1走査線分となる画素群の各画素の光エネルギ値を拡散していく処理である。また、また、図25で示す各ステップのうち、ステップS2503、ステップS2507〜ステップS2510は、図11で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理の「X」が「Q」に置き換わっている。さらに、ステップS2510は、ステップS1110の「W」が「P」に置き換わっている。前述以外の変更点はないため、各ステップの説明を省略する。
図26は、Y=−X方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その2)である。図26で示す各ステップのうち、ステップS2610、ステップS2611は、図12で説明したステップS1208、ステップS1209の処理の「X」が「Q」に置き換わっている。さらに、ステップS2614は、ステップS1212の「Y」が「R」に置き換わっている。ステップS2607〜ステップS2609、ステップS2613の処理は、図12で示したステップS1205〜ステップS1207、ステップS1211の処理と同一であるため、説明を省略する。以下、ステップS2601〜ステップS2606について、説明を行う。
ステップS2511の実行終了後、画像変換装置100は、RとTBL[I].yとの加算結果をR2に格納する(ステップS2601)。次に、画像変換装置100は、R、R2を引数としてRo取得処理を実行する(ステップS2602)。Ro取得処理の詳細は、図29にて説明する。続けて、画像変換装置100は、Qに0を格納する(ステップS2603)。次に、画像変換装置100は、QとTBL[I].xとRoとの加算結果を、Q2に格納する(ステップS2604)。続けて、画像変換装置100は、R2、Q2を引数としてX・Y取得処理を実行する(ステップS2605)。R2、Q2を引数としてX・Y取得処理を実行することにより、画像変換装置100は、X2、Y2を取得できる。
次に、画像変換装置100は、Y2が0より小さいか、またはY2がH以上か否かを判断する(ステップS2606)。Y2が0以上であり、かつY2がH未満である場合(ステップS2606:No)、画像変換装置100は、ステップS2607の処理に移行する。Y2が0より小さいか、またはY2がH以上である場合(ステップS2606:Yes)、画像変換装置100は、ステップS2610の処理に移行する。
また、Y=−X方向に走査する場合の光拡散処理の終了後、画像変換装置100は、ステップS805の処理となる、RがHとWの加算結果未満であるか否かを判断することにより、「全ての走査線に対して処理したか」を判断する。RがHとWの加算結果未満であれば、まだ処理していない走査線があることになり、画像変換装置100は、ステップS805:Noの処理を実行する。また、RがHとWの加算結果以上であれば、全ての走査線に対して処理したことになり、ステップS805:Yesの処理を実行する。
図27は、P取得処理手順の一例を示すフローチャートである。P取得処理は、Rを引数として、Pの値を出力する処理である。画像変換装置100は、RがWより小さいか否かを判断する(ステップS2701)。RがWより小さい場合(ステップS2701:Yes)、画像変換装置100は、PにRの値を格納する(ステップS2702)。RがW以上である場合(ステップS2701:No)、続けて、画像変換装置100は、RがHより大きいか否かを判断する(ステップS2703)。RがH以下である場合(ステップS2703:No)、画像変換装置100は、PにWの値を格納する(ステップS2704)。RがHより大きい場合(ステップS2703:Yes)、画像変換装置100は、Pに、WとHの加算結果に、Rを引いた結果を格納する(ステップS2705)。
ステップS2702の処理か、ステップS2704の処理か、ステップS2705の処理かのいずれかを実行した後、画像変換装置100は、P取得処理を終了する。P取得処理を実行することにより、画像変換装置100は、Pの値を取得することができる。
図28は、X・Y取得処理手順の一例を示すフローチャートである。X・Y取得処理は、R、Qを引数として、X、Yの値を出力する処理である。画像変換装置100は、RがH以下か否かを判断する(ステップS2801)。RがH以下である場合(ステップS2801:Yes)、画像変換装置100は、XにQの値を格納する(ステップS2802)。続けて、画像変換装置100は、RからQを引いた結果をYに格納する(ステップS2803)。
RがHより大きい場合(ステップS2801:No)、画像変換装置100は、Q+Rの加算結果から、Hを引いた減算結果を、Xに格納する(ステップS2804)。続けて、画像変換装置100は、HからQを引いた減算結果をYに格納する(ステップS2805)。ステップS2803の処理か、ステップS2805の処理かを実行した後、画像変換装置100は、X・Y取得処理を終了する。X・Y取得処理を実行することにより、画像変換装置100は、XとYの値を取得することができる。
図29は、Ro取得処理手順の一例を示すフローチャートである。Ro取得処理は、R、R2を引数として、Roの値を出力する処理である。画像変換装置100は、RがH以下か否かを判断する(ステップS2901)。RがH以下である場合(ステップS2901:Yes)、続けて、画像変換装置100は、R2がH以下か否かを判断する(ステップS2902)。R2がH以下である場合(ステップS2902:Yes)、画像変換装置100は、RからR2を引いた減算結果をRoに格納する(ステップS2903)。
RがH以下でない場合(ステップS2901:No)、続けて、画像変換装置100は、R2がH以下か否かを判断する(ステップS2904)。R2がHより大きい場合(ステップS2904:No)、画像変換装置100は、R2からRを引いた減算結果をRoに格納する(ステップS2905)。
R2がH以下でない場合(ステップS2902:No)、またはR2がH以下である場合(ステップS2904:Yes)、画像変換装置100は、R2とRの加算結果から、2・Hを引いた減算結果をRoに格納する(ステップS2906)。ステップS2903か、ステップS2905か、ステップS2906かの処理を実行した後、画像変換装置100は、Ro取得処理を終了する。Ro取得処理を実行することにより、画像変換装置100は、Roの値を取得することができる。
(同一の画素列を複数回走査する例)
図4〜図29では、同一の画素列を複数回走査することがなかったが、同一の画素列を複数回走査してもよい。同一の画素列を複数回走査することにより、移動平均以外の拡散を実現することができる。同一の画素列を複数回走査する例について、図30、図31を用いて説明する。
図30は、絞り形状の第3の例と絞り形状テーブルの記憶内容の第3の例を示す説明図である。図30の(A)は、四角錐状に光が拡散する場合の拡散係数を示している。中央の部分は拡散量が大きく、外側に行くにつれ、拡散量が小さくなる。図30の(B)は、四角錐状に拡散する場合の絞り形状テーブル310_pの記憶内容の一例を示す。絞り形状テーブル310_pは、レコード3001−1〜レコード3001−9を記憶している。
図31は、絞り形状の第4の例と絞り形状テーブルの記憶内容の第4の例を示す説明図である。図31の(A)は、ガウシアンブラーを行う際の光が拡散する様子を示している。図31の(B)は、ガウシアンブラーを行う際の拡散係数を示している。図31の(C)は、ガウシアンブラーを行う際の絞り形状テーブル310_gの記憶内容の一例を示す。絞り形状テーブル310_gは、レコード3101−1〜レコード3101−15を記憶している。絞り形状テーブル310_gは、x、y、wフィールドの他に、何倍で加算するという情報を格納するnフィールドを有する。
nフィールドの具体的な使用方法として、画像変換装置100は、図11のステップS1108の処理を、「CNT[Y2][X]+=LCNT[X+J]*TBL[I].n」に置き換えて実行する。さらに、画像変換装置100は、図12のステップS1206の処理を、「ENG[Y2][X]+=LINE2[X]*TBL[I].n」に置き換えて実行する。nフィールドを有することで、何度も同じフィールドを加算することがなくなるため、処理量を減らすことができる。
(光エネルギ値とRGB値の変換)
続けて、光エネルギ値とRGB値の変換の処理について説明する。ステップS1002で示したRGB値から光エネルギ値の変換処理と、ステップS1304で示した光エネルギ値からRGB値の変換処理は浮動小数点演算であるため、浮動小数点演算は整数演算と比べるとCPU負荷が高くなり、処理速度が遅くなる。したがって、RGB値から光エネルギ値の変換処理と、光エネルギ値からRGB値の変換処理とについて、整数演算で行う方法について説明する。また、(1)式、(2)式について、k=40、b=−4.5を用いて説明する。
RGB値から光エネルギ値の変換処理については、IN[Y][X]が0〜255の256通りであるため、変換テーブルを参照することで、高速に処理することができる。具体的には、画像変換装置100は、exp(n/40+4.5)について、nを0から255まで設定した際の出力値を、exptbl[n=256]に格納しておく。たとえば、xptbl=[90,92,95,97,…,52839]となる。そして、画像変換装置100は、RGB値から光エネルギ値を変換する際に、exptbl[IN[Y][X]]の値を取得する。
RGB値から光エネルギ値の変換処理については、(2)式のeが大きくなるため、変換テーブルを用意することが現実的ではなくなる。この問題は、整数型のnビット目が2のn乗を示していることを利用することにより、小さなテーブルと簡単な演算で解決できる。整数Eの最上位の非零ビット数をnとし、n−1,n−2,n−3…ビットの状態をa,b,c,…とした場合、光エネルギ値Eの値は、下記(3)式で表現できる。
E=2^n+a・2^(n−1)+b・2^(n−2)+c・2^(n−3)+… …(3)
また、(3)式は、下記(4)式のように変形できる。
E=2^n(1+a/2+b/4+c/8+…) …(4)
これにより、logEの値は、下記(5)式のように変形できる。
logE=n・log2+log(1+a/2+b/4+c/8+…) …(5)
ここで、log2は定数であるため第一項は簡単な掛け算で計算できる。一方、第二項は、a,b,c,…の個数を決定することで分解能が定まり、テーブル参照で求めることができる。log2は0.693と1以下であるため、そのままでは整数型で計算することは難しい。そこで、画像変換装置100は、適当な値としてM倍して保持し、後で割る処理を行う。同様に、画像変換装置100は、(log(1+a/2+b/4+…))のテーブルも同じ倍率で作りまとめて割る処理を行う。logEの演算ができたら、輝度Dは簡単に求めることができる。次に、図32にて、前述したアルゴリズムに従ったフローチャートを示す。図32にて示すフローチャートでは、k=40,b=−4.5,M=4とし、logテーブルの大きさを32として説明する。
図32は、光エネルギ値からRGB値への変換処理手順の一例を示すフローチャート(その1)である。光エネルギ値からRGB値への変換処理は、光エネルギ値からRGB値を出力する処理である。光エネルギ値からRGB値への変換処理を実行する前に、画像変換装置100は、log(1+n/32)*40*4について、nを0から31まで設定した際の出力値をlogtbl[n=32]に格納しておく。変換処理の1番目として、画像変換装置100は、まず光エネルギ値Eを(1+e/32)・2^mという形式に表現しなおす処理を行う。
始めに、画像変換装置100は、乗数mに0を格納する(ステップS3201)。さらに、画像変換装置100は、2^mを示す変数kに1を格納する(ステップS3202)。続けて、画像変換装置100は、Eがk以上か否かを判断する(ステップS3203)。Eがk未満である場合(ステップS3203:No)、画像変換装置100は、mの値をインクリメントする(ステップS3204)。さらに、画像変換装置100は、kを1ビット左シフトした結果をkに格納する(ステップS3205)。なお、図32のステップS3205で示した“<<=”は、右辺分のビット数で左辺を左シフトした値を、左辺に代入する演算子である。ステップS3205の処理終了後、画像変換装置100は、ステップS3203の処理に移行する。
Eがk以上である場合(ステップS3203:Yes)、2^mがEより大きいため、画像変換装置100は、mの値をデクリメントする(ステップS3206)。ステップS3206まで処理を実行することによりmが得られた。引き続き、図33にて、eを求める。
図33は、光エネルギ値からRGB値への変換処理手順の一例を示すフローチャート(その2)である。画像変換装置100は、eにEの値を格納する(ステップS3301)。次に、ステップS3302〜ステップS3305の処理は、eのm−1ビットから下5ビットで表現される整数を取り出す処理である。
ステップS3301の実行終了後、画像変換装置100は、mが5未満であるか否かを判断する(ステップS3302)。ステップS3302の処理は、eが二進数でいう6桁以上の数かどうかを判定する処理となる。なお、mは0,1,2,…と数えているため桁数はm+1で表現される。
mが5以上である場合(ステップS3302:No)、画像変換装置100は、m−5ビット分eを右シフトした値を、eに格納する(ステップS3303)。ステップS3303の処理により、eのm−1ビット目が5桁目になる。また、図33のステップS3303で示した“>>=”は、右辺分のビット数で左辺を右シフトした値を、左辺に代入する演算子である。また、mが5未満である場合(ステップS3302:Yes)、画像変換装置100は、5−m分eを左シフトした値を、eに格納する(ステップS3304)。ステップS3303、またはステップS3304の処理により、eの最上位ビットが6桁目、ビット数でいうと5ビット目に存在する。
ステップS3303、またはステップS3304の処理実行後、最上位ビットを消去して下位5ビットを残すため、画像変換装置100は、eと0x1fとの論理積の結果をeに格納する(ステップS3305)。なお、図33のステップS3305で示した“&=”は、右辺と左辺の論理積を左辺に代入する演算子である。
ステップS3305までの処理により、E≒(1+e/32)・2^mとした時のeとmが得られた。このEは、exp(D/40+4.5)であるため、D=40logE−180と表現できる。このlogEを先程のE=(1+e/32)・2^mを用いて整理するとDは下記(6)式のように変形できる。
D=40mlog2+40log(1+e/32)−180=(m*40*4*log2+40*4*log(1+e/32))/4−180 …(6)
(6)式のうち、40*4*log2は、おおよそ111であり、40*4*log(1+e/32)の値はテーブルlogtblに格納されている。したがって、画像変換装置100は、(m*111+logtbl[e])/4−180を計算し、計算結果を輝度dに格納する(ステップS3306)。
続けて、画像変換装置100は、輝度dが0〜255の範囲のため、ステップS3307〜ステップS3310で範囲内に収まっているか確認する。具体的には、画像変換装置100は、dが0未満か否かを判断する(ステップS3307)。dが0未満である場合(ステップS3307:Yes)、画像変換装置100は、dに0を格納する(ステップS3308)。dが0以上である場合(ステップS3307:No)、画像変換装置100は、dが255より大きいか否かを判断する(ステップS3309)。
dが255より大きい場合(ステップS3309:Yes)、画像変換装置100は、dに255を格納する(ステップS3310)。dが255以下である場合(ステップS3309:No)か、ステップS3308の処理が終了した場合か、ステップS3310の処理が終了した場合、画像変換装置100は、光エネルギ値からRGB値への変換処理を終了する。図32、図33で示したフローチャートを実行することにより、画像変換装置100は、(2)式よりも高速に変換処理を行える。
図34は、本実施の形態における画像変換処理の結果の一例を示す説明図(その1)である。図34では、絞り形状を6角形とした場合の、元画像3401_IN、元画像3402_INと、ぼかし画像3401_OUT、ぼかし画像3402_OUTを表示している。元画像3401_IN、元画像3402_INにて白い箇所が、ぼかし画像3401_OUT、ぼかし画像3402_OUTでは白い領域が6角形状に分散している。
図35は、本実施の形態における画像変換処理の結果の一例を示す説明図(その2)である。図35では、元画像3501_INと、ぼかし画像3501_5_OUT〜ぼかし画像3501_41_OUTを表示している。ぼかし画像3501_x_OUTの“x”は、絞り形状の大きさを示している。具体的に、図35には、x=5、9、13、17、21、25、29、33、37、41を表示している。元画像3501_INにて白い箇所が、絞り形状の大きさが大きくなるほど、ぼかし画像上での6角形が大きくなる。
図36は、画素ごとの画像変換処理と本実施の形態における画像変換処理との速度比較を示す説明図である。図36では、322[画素]×482[画素]を元画像とし、絞り形状を6角形にして、ぼかし画像に変換した場合の処理時間を表示している。
画素ごとの画像変換処理は、計算結果を再利用せずにぼかし画像を変換する処理である。図36上の、画素ごとの画像変換処理の処理時間を示すグラフ3601は、絞り形状の大きさが大きくなるほど、処理時間が大きくなる。たとえば、絞り形状の大きさが20[画素]である場合、画素ごとの画像変換処理の処理時間は、1200[msec]となる。本実施の形態における画像変換処理の処理結果を示すグラフ3602は、絞り形状の大きさが大きくなっても、処理時間が短いままに抑えることができる。たとえば、絞り形状の大きさが20[画素]である場合、本実施の形態における画像変換処理の処理時間は、約50[msec]となる。
以上説明したように、画像変換装置100によれば、絞り形状と重なる第1の画素列中の第1の画素の変換結果を用いて、絞り形状と重なる領域での相対位置が第1の画素と一致する第2の画素列中の第2の画素を変換する。これにより、影響を与える画素が第1の画素と第2の画素とで共通しているため、画像変換装置100は、たとえば、第1の画素の変換結果をそのまま再利用して画像変換時の計算量を減らすことができる。
また、画像変換装置100によれば、対象画素列のうちの、第1の画素が含まれるように絞り形状を移動させた際にいずれかの画素と重なる画素の値に基づいて算出した、元画像を変換した場合の第1の画素の値を用いて、変換後の第2の画素の値を算出してもよい。これにより、画像変換装置100は、再利用可能な第1の画素の変換結果を算出して、第2の画素の値の算出時に、第1の画素の変換結果を再利用することができるため、画像変換時の計算量を減らすことができる。
また、画像変換装置100によれば、元画像を変換した場合の第1の画素の値と、第2の画素が含まれるように絞り形状を移動させた際にいずれかの画素と重なる画素の値とに基づいて、変換後の第2の画素の値を算出してもよい。これにより、画像変換装置100は、第2の画素に影響を与える画素群が、第1の画素に影響を与える画素に全て含まれている場合、第1の画素の変換結果を再利用して画像変換時の計算量を減らすことができる。
また、画像変換装置100によれば、対象画素列の各々の画素ごとに、走査方向または走査方向の逆方向のいずれかの方向に向かって、各々の画素から第1の画素群の画素数分先の画素までの各画素の値に基づき、変換後の各々の画素の値を算出する。続けて、画像変換装置100は、変換後の各々の画素の値のうちの、拡散元画素からいずれかの方向の逆方向に向かって、第1の画素群のいずれかの方向にある端の画素から第1の画素までの画素数分先の位置にある画素の値を、第1の画素の値に設定してもよい。これにより、画像変換装置100は、行ごとにまとめて移動平均を算出していくため、連続した領域にアクセスすることになり、処理の高速化を図ることができる。連続した領域にアクセスできる場合、たとえば、キャッシュラインに存在している可能性が高くなるため、画像変換処理の高速化を図ることができる。
また、画像変換装置100によれば、対象画素列の各々の画素ごとに、第1の画素群の画素数を用いて算出した変換後の各々の画素の値に基づき、各々の画素から第2の画素群の画素数分先の画素までの各画素の値に基づく変換後の各々の画素の値を算出してもよい。これにより、画像変換装置100は、一度算出した移動平均を再利用できるため、計算量を削減することができる。
また、画像変換装置100によれば、ユーザが指定した形状に応じた走査方向に応じて、画像変換処理を行ってもよい。たとえば、ユーザが指定した形状がy軸に対して走査する方がx軸に対して走査する方より絞り形状テーブル310のレコード数が少なくなる場合、画像変換装置100は、走査方向としてy軸方向を選択することにより、計算量を少なくすることができる。また、x軸に対して走査する場合と、y軸に対して走査する場合とで、絞り形状テーブル310のレコード数が同一となる可能性もある。この場合、画像変換装置100は、連続した領域に処理が可能なx軸方向を走査方向として選択することにより、画像変換処理の高速化を図ることができる。
また、本実施の形態にかかる画像変換処理は、計算量が少なくなるために、スマートフォンや携帯電話といった、CPUの処理能力が非力な携帯端末が実行しても、ユーザにストレスを与えない短い時間で画像変換処理を完了することができる。また、本実施の形態にかかる画像変換処理は、パーソナル・コンピュータで実行されてもよい。たとえば、写真画像の加工を行う場合、背景と前景を切り分けることが可能な他のアプリケーションにより、背景と前景を切り分けておき、背景に対して本実施の形態にかかる画像変換処理を実行してもよい。これにより、ユーザは、カメラで撮影したようなきれいなぼかし画像を短時間で得ることができる。
なお、本実施の形態で説明した画像変換方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本画像変換プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本画像変換プログラムは、インターネット等のネットワークを介して配布してもよい。
100 画像変換装置
101 絞り形状
301 選択部
302 対象画素列取得部
303 抽出部
304 画素数取得部
305 画素特定部
306 拡散元画素特定部
307 算出部
310 絞り形状テーブル
311 一時記憶領域
本発明は、画像変換プログラム、画像変換装置、および画像変換方法に関する。
従来、画像を、ぼかし効果を与えた画像に変換する技術がある。たとえば、入力画像の処理対象画素それぞれにぼかし範囲を計算し、ぼかし効果を与える処理を行う技術がある。また、サイズが異なる複数の移動平均フィルタを用いてフィルタ処理を行い、複数のぼかし画像を生成し、複数のぼかし画像データの互いに対応する各画素に関し、ぼかし画像ごとに重みを与えて、各ぼかし画像データの平均値を合成ぼかし画像とする技術がある。また、入力画像の各画素のRGB値から露光量を計算処理によって求め、各画素の露光量にぼかし効果を与える処理を行い、ぼかし効果を与えた各画素の露光量をRGB値に戻す技術がある。(たとえば、下記特許文献1〜3を参照。)
特開平06−036022号公報 特開2004−133551号公報 特開2001−216513号公報
しかしながら、上述した従来技術において、画像に対してぼかし効果を与える処理の計算量が多くなり、画像の変換処理にかかる処理時間の増加を招くという問題がある。たとえば、ぼかし効果を与える処理は、画像内の画素ごとに画素の値をぼかし範囲となる絞り形状に合わせて均等に分布する処理となるため、計算量が多くなる。
本発明は、上述した従来技術による問題点を解消するため、ぼかし効果を与える処理の処理時間の短縮を図る画像変換プログラム、画像変換装置、および画像変換方法を提供することを目的とする。
上述した課題を解決し、目的を達成するため、本発明の一側面によれば、変換対象となる画像の中の対象画素列と平行な画素列のうちの、対象画素列のいずれかの画素から所定範囲の画素群によって形成される領域と重なる第1の画素列と、領域と連続して重なる画素数が第1の画素列以上の第2の画素列とを抽出し、抽出した第1の画素列の中の領域に含まれる第1の画素群のうちの対象画素列の走査方向または走査方向の逆方向のいずれかの方向にある端の画素から第1の画素群に含まれる第1の画素までの画素数を取得し、抽出した第2の画素列の中の領域に含まれる第2の画素群のうちのいずれかの方向にある端の画素からいずれかの方向の逆方向に向かって、取得した画素数分先の位置にある第2の画素を特定し、画像を変換した場合の第1の画素の値を記憶する記憶部を参照して、画像を変換した場合の第2の画素の値を算出する画像変換プログラム、画像変換装置、および画像変換方法が提案される。
本発明の一側面によれば、ぼかし効果を与える処理の処理時間の短縮を図ることができるという効果を奏する。
図1Aは、本実施の形態にかかる画像変換装置の動作例を示す説明図(その1)である。 図1Bは、本実施の形態にかかる画像変換装置の動作例を示す説明図(その2)である。 図2は、画像変換装置のハードウェア構成例を示すブロック図である。 図3は、画像変換装置の機能構成例を示すブロック図である。 図4は、絞り形状の第1の例と絞り形状テーブルの記憶内容の第1の例を示す説明図である。 図5は、画像変換処理の動作例を示す説明図(その1)である。 図6は、画像変換処理の動作例を示す説明図(その2)である。 図7は、画像変換処理の動作例を示す説明図(その3)である。 図8は、x軸方向に走査する場合の画像変換処理手順の一例を示すフローチャートである。 図9は、x軸方向に走査する場合の初期化処理手順の一例を示すフローチャートである。 図10は、x軸方向に走査する場合の光エネルギ値変換処理手順の一例を示すフローチャートである。 図11は、x軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その1)である。 図12は、x軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その2)である。 図13は、RGB値変換処理手順の一例を示すフローチャートである。 図14は、絞り形状テーブルを用いない場合の画像変換処理の動作例を示す説明図である。 図15は、絞り形状テーブルを用いない場合の光拡散処理手順の一例を示すフローチャート(その1)である。 図16は、絞り形状テーブルを用いない場合の光拡散処理手順の一例を示すフローチャート(その2)である。 図17は、絞り形状の第2の例と絞り形状テーブルの記憶内容の第2の例を示す説明図である。 図18は、y軸方向に走査する場合の初期化処理手順の一例を示すフローチャートである。 図19は、y軸方向に走査する場合の光エネルギ値変換処理手順の一例を示すフローチャートである。 図20は、y軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その1)である。 図21は、y軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その2)である。 図22は、Y=−X方向に走査する場合の画像変換処理の動作例を示す説明図である。 図23は、Y=−X方向に走査する場合の初期化処理手順の一例を示すフローチャートである。 図24は、Y=−X方向に走査する場合の光エネルギ値変換処理手順の一例を示すフローチャートである。 図25は、Y=−X方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その1)である。 図26は、Y=−X方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その2)である。 図27は、P取得処理手順の一例を示すフローチャートである。 図28は、X・Y取得処理手順の一例を示すフローチャートである。 図29は、Ro取得処理手順の一例を示すフローチャートである。 図30は、絞り形状の第3の例と絞り形状テーブルの記憶内容の第3の例を示す説明図である。 図31は、絞り形状の第4の例と絞り形状テーブルの記憶内容の第4の例を示す説明図である。 図32は、光エネルギ値からRGB値への変換処理手順の一例を示すフローチャート(その1)である。 図33は、光エネルギ値からRGB値への変換処理手順の一例を示すフローチャート(その2)である。 図34は、本実施の形態における画像変換処理の結果の一例を示す説明図(その1)である。 図35は、本実施の形態における画像変換処理の結果の一例を示す説明図(その2)である。 図36は、画素ごとの画像変換処理と本実施の形態における画像変換処理との速度比較を示す説明図である。
以下に添付図面を参照して、開示の画像変換プログラム、画像変換装置、および画像変換方法の実施の形態を詳細に説明する。
図1Aは、本実施の形態にかかる画像変換装置の動作例を示す説明図(その1)である。画像変換装置100は、元画像を受け付けると、元画像にぼかし効果を与える処理を行い、ぼかし画像として変換するコンピュータである。画像変換装置100は、たとえば、スマートフォンや携帯電話等の携帯端末である。たとえば、画像変換装置100がユーザにより操作されている状態にて、画像変換装置100が、ポップアップダイアログを表示する場合を想定する。このとき、ポップアップダイアログ以外の背面をぼかし効果によりぼかすことにより、画像変換装置100は、ポップアップダイアログに注視させるという、ユーザに対する視覚的効果を与えることができる。
しかし、ぼかし効果を与える処理は、画像内の画素数と絞り形状に含まれる画素数との積に比例しており、処理量が多くなるため、処理時間がかかる。本実施の形態にかかる画像変換装置100は、ぼかし効果を与える処理の計算量を減らして、処理時間を短縮する。
以下、元画像を、ぼかし効果を与えたぼかし画像に変換する処理を、「画像変換処理」と称する。また、元画像とぼかし画像の大きさは、縦幅H[画素]、横幅W[画素]と定義する。また、元画像の符号を、INとし、ぼかし画像の符号をOUTと定義する。さらに、元画像およびぼかし画像は、直交する2次元座標にあり、水平軸をx軸とし、垂直軸をy軸とする。元画像のx=X、y=Yの画素を、IN[Y][X]として示し、変換後となるぼかし画像のx=X、y=Yの画素を、OUT[Y][X]として示す。また、IN[Y]は、元画像のy=Yの行の画素列を示し、OUT[Y]は、ぼかし画像のy=Yの行の画素列を示す。
図1Aの(A)は、絞り形状101を示している。絞り形状101は、予めユーザによって指定された絞り形状となる。指定された絞り形状101は、拡散元画素から所定範囲の画素群によって形成される領域の形状となる。絞り形状101の中央となるx=0、y=0の画素は、所定範囲の画素群に画素の値を拡散させる拡散元画素となる。画素の値は、RGB値でもよいし、RGB値を変換した露光量を表す光エネルギ値でもよい。光エネルギ値は、照度と時間をかけ合わせた値となる。
図1Aでの所定範囲の画素群は、y=2、−2の行の、−1≦x≦1を満たす画素となり、y=−1、0、1の行の、−2≦x≦2を満たす画素となる。以上から、絞り形状に含まれる画素群は、21[画素]となる。画像変換装置100の画面の画素数が、320[画素]×480[画素]である場合、画像内の画素数と絞り形状に含まれる画素数との積は、320×480×21=3225600[画素]となる。本実施の形態にかかる画像変換装置100は、ぼかし処理の計算量の減少を図る。
図1Aの(B1)〜図1Aの(B3)では、ぼかし形状と重なる画素について、どの画素が影響を与えているかを示した図である。図1Aの(B1)〜図1Aの(B3)では、画像変換装置100が、入力画像を水平方向に走査して得られる、光を拡散させる拡散元画素の対象画素列をy=5とした場合について説明する。なお、走査方向は、x軸方向でもよいし、y軸方向でもよいし、x軸方向と、y軸方向とは異なる斜め方向としてもよい。
画像変換装置100は、対象画素列と平行な画素列のうちの、絞り形状101と重なる第1の画素列として、y=7の画素列を抽出する。さらに、画像変換装置100は、絞り形状101と連続して重なる画素数が第1の画素列以上の第2の画素列として、y=4の画素列を抽出する。具体的には、第1の画素列が絞り形状101と重なる画素数は、3[画素]であり、第2の画素列が絞り形状101と重なる画素数は、5[画素]となる。以下、走査方向における画素列が、絞り形状101と重なる画素数を「ぶれ量」と呼称する。
図1Aの(B1)にて、対象画素列のうち拡散元画素をIN[5][6]とした場合、画像変換装置100は、y=7の画素列のうち、第1の画素として、IN[7][5]を選択する。さらに、画像変換装置100は、y=4の画素列のうち、第2の画素として、IN[4][4]を特定する。第1の画素と第2の画素の位置関係は、絞り形状と重なる領域での相対位置が同一となっている。より詳細には、y=7が絞り形状101と重なる第1の画素群のうち、IN[7][5]は、走査方向の逆方向から数えると、0番目に位置する。同様に、y=4が絞り形状101と重なる第2の画素群のうち、IN[4][4]は、走査方向の逆方向から数えると、0番目に位置する。領域での相対位置は、走査方向から見てもよい。第1の画素、第2の画素ともに絞り形状101に含まれているため、第1の画素、第2の画素は、拡散元画素IN[5][6]の影響を受ける。
次に、図1Aの(B2)にて、対象画素列のうち拡散元画素をIN[5][4]とした場合も、第1の画素、第2の画素ともに絞り形状101に含まれているため、第1の画素と第2の画素は、拡散元画素IN[5][4]の影響を受ける。なお、図示していないが、対象画素列のうち拡散元画素をIN[5][5]とした場合も、第1の画素、第2の画素ともに絞り形状101に含まれているため、第1の画素、第2の画素は、拡散元画素IN[5][5]の影響を受ける。
続けて、図1Aの(B3)にて、対象画素列のうち拡散元画素をIN[5][2]とした場合、第2の画素は絞り形状101に含まれるため、第2の画素は、拡散元画素IN[5][2]の影響を受ける。しかし、第1の画素は、絞り形状101に含まれないため、第1の画素は、拡散元画素IN[5][2]の影響を受けない。なお、図示していないが、対象画素列のうち拡散元画素をIN[5][3]とした場合も、第2の画素は絞り形状101に含まれるため、第2の画素は、拡散元画素IN[5][3]の影響を受ける。しかし、第1の画素は、絞り形状101に含まれないため、第1の画素は、拡散元画素IN[5][3]の影響を受けない。
以上より、第1の画素は、拡散元画素IN[5][4]〜拡散元画素IN[5][6]の影響を受けることとなる。また、第2の画素は、拡散元画素IN[5][2]〜拡散元画素IN[5][6]の影響を受けることとなる。したがって、第1の画素と第2の画素は、影響を与える画素が一部共通していることから、計算結果を再利用することができる。また、影響を受ける画素の数は、ぶれ量と一致する。図1の(B)にて、計算結果の再利用について説明する。
図1Bは、本実施の形態にかかる画像変換装置の動作例を示す説明図(その2)である。図1Aにて説明したとおり、第1の画素と第2の画素は、影響を与える画素が一部共通している。したがって、画像変換装置100は、元画像INを変換した場合の第1の画素の値を記憶する記憶部を参照して、元画像INを変換した場合の第2の画素の値を算出する。具体的には、画像変換装置100は、元画像INを変換した場合の第1の画素の値と、拡散元画素IN[5][2]の値と、拡散元画素IN[5][3]の値との平均を、元画像INを変換した場合の第2の画素の値とする。
元画像INを変換した場合の第1の画素の値を参照しない場合、拡散元画素IN[5][2]〜拡散元画素IN[5][6]を加算するため、画像変換装置100は、4回の加算処理を行うことになる。一方、元画像INを変換した場合の第1の画素の値を参照することにより、画像変換装置100は、2回の加算処理で済む。以降、図2〜図36を用いて、画像変換装置100の動作について詳細に説明する。
(画像変換装置100のハードウェア)
図2は、画像変換装置のハードウェア構成例を示すブロック図である。図2において、スマートフォンなどの携帯端末を想定する画像変換装置100は、CPU201と、ROM(Read Only Memory)202と、RAM(Random Access Memory)203と、フラッシュROM204と、フラッシュROMコントローラ205と、フラッシュROM206を有する。画像変換装置100は、さらに、ディスプレイ207と、I/F208と、タッチパネル209を有する。各部は、それぞれバス210で接続されている。
ここで、CPU201は、画像変換装置100の全体の制御を司る制御装置である。ROM202は、ブートプログラムなどのプログラムを記憶している不揮発性メモリである。RAM203は、CPU201のワークエリアとして使用される揮発性メモリである。フラッシュROM204は、書き換え可能な不揮発性メモリであり、たとえば、読出し速度が高速なNOR型フラッシュメモリである。フラッシュROM204は、OS(Operating System)などのシステムソフトウェアやアプリケーションソフトウェアなどを記憶している。たとえば、OSを更新する場合、画像変換装置100は、I/F208によって新しいOSを受信し、フラッシュROM204に格納されている古いOSを、受信した新しいOSに更新する。また、本実施の形態にかかる画像変換プログラムは、OSから呼ばれるシステムコールとして、フラッシュROM204内に存在していてもよい。
フラッシュROMコントローラ205は、CPU201の制御にしたがってフラッシュROM206に対するデータのリード/ライトを制御する制御装置である。フラッシュROM206は、書き換え可能な不揮発性メモリであり、たとえば、データの保存、運搬を主に目的とした、NAND型フラッシュメモリである。フラッシュROM206は、フラッシュROMコントローラ205の制御で書き込まれたデータを記憶する。データの具体例としては、画像変換装置100を使用するユーザがI/F208を通して取得した画像データ、映像データなどや、また本実施の形態にかかる画像変換プログラムを記憶してもよい。フラッシュROM206は、たとえば、メモリカード、SDカードなどを採用することができる。
ディスプレイ207は、カーソル、アイコンあるいはツールボックスを始め、文書、画像、機能情報などのデータを表示する。ディスプレイ207は、たとえば、TFT液晶ディスプレイなどを採用することができる。
I/F208は、通信回線を通じてLAN(Local Area Network)、WAN(Wide Area Network)、インターネットなどのネットワーク211に接続され、ネットワーク211を介して他の装置に接続される。そして、I/F208は、ネットワーク211と内部のインターフェースを司り、外部装置からのデータの入出力を制御する。I/F208には、たとえばモデムやLANアダプタなどを採用することができる。タッチパネル209は、ユーザからの接触により、データの入力を行う装置である。
(画像変換装置100の機能)
次に、画像変換装置100の機能について説明する。図3は、画像変換装置の機能構成例を示すブロック図である。画像変換装置100は、選択部301と、対象画素列取得部302と、抽出部303と、画素数取得部304と、第2の画素特定部305と、拡散元画素特定部306と、算出部307と、を含む。制御部となる選択部301〜算出部307は、記憶装置に記憶されたプログラムをCPU201が実行することにより、選択部301〜算出部307の機能を実現する。記憶装置とは、具体的には、たとえば、図2に示したROM202、RAM203、フラッシュROM204、フラッシュROM206などである。または、I/F208を経由して他のCPUが実行することにより、選択部301〜算出部307の機能を実現してもよい。
また、画像変換装置100は、絞り形状テーブル310と、一時記憶領域311にアクセス可能である。絞り形状テーブル310は、いずれかの画素から所定範囲の画素群によって形成される領域の形状と、走査方向とを関連付けて記憶する記憶領域である。一時記憶領域311は、元画像INを変換した画像OUTの画素の値を一時的に記憶する記憶領域である。絞り形状テーブル310と、一時記憶領域311は、RAM203、フラッシュROM204、フラッシュROM206といった記憶装置に格納されている。
選択部301は、絞り形状テーブル310を参照して、指定された絞り形状に応じた走査方向を選択する。絞り形状は、たとえば、ユーザにより指定される。または、開発者によって絞り形状が指定されていてもよい。絞り形状は、たとえば、6角形、ハート型、星型、など、どのような形状であってもよい。たとえば、選択部301は、ユーザにより指定された絞り形状が6角形の絞り形状であれば、絞り形状テーブル310に記憶されている走査方向としてx軸方向を選択する。なお、選択されたデータは、RAM203、フラッシュROM204、フラッシュROM206などの記憶領域に記憶される。
対象画素列取得部302は、元画像INの中から、選択部301によって選択された走査方向に走査して対象画素列を取得する。たとえば、選択部301が走査方向としてx軸方向を選択したとする。このとき、対象画素列取得部302は、元画像INの中から、x軸方向に走査して対象画素列として、y=5の画素列を選択する。対象画素列取得部302は、繰り返し対象画素列を取得してもよい。たとえば、対象画素列取得部302は、y=0の画素列から、y=H−1の画素列までを対象画素列として取得してもよい。
抽出部303は、変換対象となる画像の中の対象画素列と平行な画素列のうちの、対象画素列のいずれかの画素から所定範囲の画素群によって形成される領域と重なる第1の画素列と、領域と連続して重なる画素数が第1の画素列以上の第2の画素列とを抽出する。いずれかの画素は、画素の値の拡散元画素となる。図1の例では、拡散元画素を、IN[y=5][x=6]とする。たとえば、抽出部303は、y=5の画素列と平行な画素列のうちの、絞り形状101と重なる第1の画素列としてy=7の画素列と、絞り形状101と重なる画素数が第1の画素列以上の第2の画素列として、y=4の画素列とを抽出する。
画素数取得部304は、抽出部303によって抽出された第1の画素列の中の領域に含まれる第1の画素群のうちの対象画素列の走査方向または走査方向の逆方向のいずれかの方向にある端の画素から第1の画素群に含まれる第1の画素までの画素数を取得する。たとえば、選択部301が走査方向としてx軸方向を選択したとする。図1Aの例とすると、第1の画素群は、IN[y=7][x=5]〜IN[y=7][x=7]となる。また、第2の画素群は、IN[y=4][x=4]〜IN[y=4][x=8]となる。第1の画素は、第1の画素群のいずれであってもよい。また、第1の画素を、IN[y=7][x=5]として説明する。
また、いずれかの方向は、走査方向がx軸方向であればx軸の正の方向でもよいし、x軸の負の方向でもよい。たとえば、画素数取得部304は、第1の画素群のうちのx軸の負の方向にある端の画素IN[y=7][x=5]から、第1の画素IN[y=7][x=5]までの画素数0を取得する。なお、取得された画素数は、RAM203、フラッシュROM204、フラッシュROM206などの記憶領域に記憶される。
第2の画素特定部305は、第2の画素列の中の領域に含まれる第2の画素群のうちのいずれかの方向にある端の画素からいずれかの方向の逆方向に向かって、画素数取得部304に取得した画素数分先の位置にある第2の画素を特定する。たとえば、第2の画素特定部305は、第2の画素群のうちのx軸の負の方向にある端の画素IN[y=4][x=4]から、x軸の正の方向に向かって、画素数0分の位置にある第2の画素IN[y=4][x=4]を特定する。なお、特定された第2の画素のx座標の位置、y座標の位置は、RAM203、フラッシュROM204、フラッシュROM206などの記憶領域に記憶される。
拡散元画素特定部306は、対象画素列の中から、対象画素列に平行にいずれかの画素を移動させた場合の移動後のいずれかの画素と重なる画素を特定する。いずれかの画素を移動させる際、拡散元画素特定部306は、対象画素列に平行にいずれかの画素を移動させた移動後のいずれかの画素から所定範囲の画素群によって形成される領域内に第1の画素が含まれるように、いずれかの画素を移動させる。たとえば、拡散元画素特定部306は、対象画素列となるy=5の中から、絞り形状101に第1の画素IN[y=4][x=4]が含まれるように拡散元画素を移動させる。そして、拡散元画素特定部306は、いずれかの画素と重なった画素IN[5][4]〜画素IN[5][6]を特定する。
また、拡散元画素特定部306は、対象画素列の中から、対象画素列に平行にいずれかの画素を移動させた場合の移動後のいずれかの画素と重なる画素を特定する。いずれかの画素を移動させる際、拡散元画素特定部306は、対象画素列に平行にいずれかの画素を移動させた移動後のいずれかの画素から所定範囲の画素群によって形成される領域内に第2の画素が含まれるように、いずれかの画素を移動させる。なお、特定された画素のx座標の位置、y座標の位置は、RAM203、フラッシュROM204、フラッシュROM206などの記憶領域に記憶される。
算出部307は、画像を変換した場合の第1の画素の値を記憶する一時記憶領域311を参照して、元画像INを変換した場合の第2の画素の値を算出する。たとえば、拡散元画素特定部306は、第1の画素が含まれるようにいずれかの画素を移動させた際に特定された画素群と、第1の画素が含まれるようにいずれかの画素を移動させた際に特定された画素群とが一致したとする。この場合、算出部307は、一時記憶領域311に記憶された第1の画素の値を、元画像INを変換した場合の第2の画素の値に設定する。
また、算出部307は、拡散元画素特定部306によって特定された画素の値に基づいて、元画像INを変換した場合の第1の画素の値を算出してもよい。たとえば、算出部307は、拡散元画素IN[5][4]〜拡散元画素IN[5][6]の値を加算して、元画像INを変換した第1の画素OUT[7][5]の値を算出する。
また、算出部307は、算出部307によって算出された第1の画素の値に基づいて、画像を変換した場合の第2の画素の値を算出してもよい。また、算出部307は、元画像INを変換した場合の第1の画素の値と特定した画素の値とに基づいて、画像を変換した場合の第2の画素の値を算出してもよい。たとえば、算出部307は、第1の画素OUT[7][5]の値と、拡散元画素IN[5][2]の値と、拡散元画素IN[5][3]の値と、を加算して、第2の画素OUT[4][4]の値を算出する。
また、算出部307は、対象画素列の各々の画素ごとに、いずれかの方向に向かって、各々の画素から第1の画素群の画素数分の画素までの各画素の値に基づいて、画像を変換した場合の第1の画素列に関する各々の画素の値を算出する。たとえば、算出部307は、y=5となる対象画素列の各々の画素ごとに、x軸方向の負の方向に向かって、各々の画素から、第1の画素群の画素数となる3個分の画素の値を加算して、画像を変換した場合の第1の画素列に関する各々の画素の値を算出する。
より詳細に記述すると、たとえば、算出部307は、IN[y=5][x=0]〜IN[y=5][x=2]の値の加算結果を、一時記憶領域311として、TMP[x=2]の値とする。以下、さらに、算出部307は、IN[y=5][x=1]〜IN[y=5][x=3]の値の加算結果を、TMP[x=3]の値とする。算出部307は、このような計算を、TMP[x=W−1+S]まで行う。ここで、Sは、ぶれ量の最大値とする。算出した結果は、一時記憶領域311に格納する。
算出部307は、算出した第1の画素列に関する各々の画素の値のうちの、いずれかの画素からいずれかの方向の逆方向に向かって、第1の画素群のいずれかの方向にある端の画素から第1の画素までの画素数分先の位置にある画素の値を第1の画素の値に設定する。
第1の画素群がIN[y=5][x=5]〜IN[y=5][x=7]であり、いずれかの方向がx軸の負の方向であり、第1の画素がIN[y=5][x=5]であるとする。この場合、第1の画素群のいずれかの方向にある端の画素から第1の画素までの画素数は、0となる。このとき、算出部307は、TMP[x=0]〜TMP[x=W−1+S]のうちの、いずれかの画素からIN[y=5][x=6]からx軸の正の方向に向かって、画素数0の位置にある画素TMP[x=6]の値を元画像を変換した第1の画素の値に設定する。
また、算出部307は、各々の画素ごとに、次の記載する情報に基づいて、画像を変換した場合の第2の画素列に関する各々の画素の値を算出してもよい。基づく情報は、いずれかの方向に向かって、各々の画素から第1の画素群の画素数分先の位置にある画素の次の画素から、各々の画素から第2の画素群の画素数分まで、の各画素の値と、算出した第1の画素列に関する各々の画素の値となる。
さらに、算出部307は、算出した第2の画素列に関する各々の画素の値のうちの、元画像を変換した場合の第2の画素の値を算出する。基づく情報は、いずれかの画素からいずれかの方向の逆方向に向かって、第1の画素群のいずれかの方向にある端の画素から第2の画素までの画素数分先の位置にある画素の値となる。算出した画素の値は、一時記憶領域311に格納される。次に、図4〜図16を用いて、x軸方向に走査する場合の画像変換処理について説明する。
(x軸方向に走査する例)
図4は、絞り形状の第1の例と絞り形状テーブルの記憶内容の第1の例を示す説明図である。図4の(A)では、xy平面上での絞り形状400を示している。図4に示すように、絞り形状400は、6角形となっている。図4の(A)内のwは、ぶれ量を図示している。図4の(B)には、x方向に走査する場合の、絞り形状400の具体的な数値が記されている。たとえば、y=4の行は、x=0から始まってw=1画素続いている。また、y=3の行は、x=−1から始まってw=3画素続いている。続けて、y=2の行は、x=−3から始まってw=7画素続いている。
図4の(C)は、絞り形状400の具体的数値を絞り形状テーブルに格納した場合の記憶内容の一例を示している。図4の(C)に示す絞り形状テーブル310は、レコード401−1〜レコード401−9を記憶している。また、絞り形状テーブル310は、走査方向としてx軸方向を関連付けて記憶している。絞り形状テーブル310は、x、y、wという3つのフィールドを含む。xフィールドには、絞り形状400の該当のy行におけるぶれ開始位置となる左端の画素のx行における位置が格納される。yフィールドには、該当のy行における画素の位置が格納される。wフィールドには、ぶれ量となる該当のy行における左端から右端までの画素数が格納される。また、絞り形状テーブル310は、wの小さい順に格納されている。
たとえば、レコード401−1は、y=4の行について、x=0から始まって1画素続いていることを示している。次に、図5〜図7を用いて、画像変換処理の動作例を説明する。
図5は、画像変換処理の動作例を示す説明図(その1)である。図5では、元画像のある画素が、変換後の画素群のうちのどの画素に影響を与えているかを説明した図である。たとえば、図5の例では、IN[0]〜IN[H−1]のうちの、処理対象行となるIN[Y]の各画素が影響を与える画素について説明する。
IN[Y][X]は、OUT[Y+4][X]に影響を与える。同様に、IN[Y][X+1]は、OUT[Y+4][X+1]に影響を与え、IN[Y][X+2]は、OUT[Y+4][X+2]に影響を与える。このように、OUT[Y+4]は、IN[Y]そのものを追加すればよい。OUT[Y−4]も同様に、IN[Y]そのものを追加すればよい。また、図5に示す「±」は、符号のみが異なる2つの値を省略して記載する記号である。また、「+=」は、右辺と左辺の加算を行い、加算結果を右辺に格納する演算子である。
また、IN[Y][X]は、OUT[Y+3][X−1]、OUT[Y+3][X]、OUT[Y+3][X+1]という3つの画素に影響を与える。同様に、IN[Y][X−1]は、OUT[Y+3][X−2]、OUT[Y+3][X−1]、OUT[Y+3][X]という3つの画素に影響を与える。同様に、IN[Y][X+1]は、OUT[Y+3][X]、OUT[Y+3][X+1]、OUT[Y+3][X+2]という3つの画素に影響を与える。
このように、OUT[Y+3][X]は、IN[Y][X−1]、IN[Y][X]、IN[Y][X+1]、という3つの画素から影響を受ける。0からW−1内の間の値をとるiを用いて一般化すると、画素OUT[Y+3][i]は、IN[Y][i−1]、IN[Y][i]、IN[Y][i+1]、という3つの画素から影響を受ける。したがって、OUT[Y+3]は、ぶれ量が3であり、IN[Y]の幅3の移動平均を追加すればよい。移動平均の生成方法については、図6にて後述する。同様に、OUT[Y−3]も、IN[Y]の幅3の移動平均を追加すればよい。同様に、OUT[Y±2]、OUT[Y±1]、OUT[Y]は、IN[Y]の幅7の移動平均を追加すればよい。
図6は、画像変換処理の動作例を示す説明図(その2)である。図6では、IN[Y]を処理対象として、一時記憶領域311となるTMPに処理結果を格納する際の移動平均の生成方法を示している。
図6の(A)では、幅1の移動平均を示している。幅1の移動平均は、元データと同一となる。たとえば、0からW−1内の間の値をとるiを用いると、TMP[i]は、IN[Y][i]の値が格納されている。次に、図6の(B)では、幅2の移動平均を示している。画像変換装置100は、幅1の移動平均を格納したTMPに、元画像の対象の行内にある次の画素の値を追加して、幅2の移動平均を生成する。たとえば、画像変換装置100は、幅1の移動平均を格納したTMP[i+1]に、IN[Y][i]の値を追加する。続けて、図6の(C)では、幅3の移動平均を示している。たとえば、画像変換装置100は、幅2の移動平均を格納したTMP[i+2]に、IN[Y][i]の値を追加する。
結果、TMP[i+2]は、IN[Y][i]、IN[Y][i+1]、IN[Y][i+2]という3つの画素の平均値となる。同様に、TMP[i+1]は、IN[Y][i−1]、IN[Y][i]、IN[Y][i+1]という3つの画素の平均値となり、TMP[i]は、IN[Y][i−2]、IN[Y][i−1]、IN[Y][i]という3つの画素の平均値となる。
同様に、画像変換装置100は、幅4、幅5、幅6、幅7の移動平均を生成する。このように、幅の大きい移動平均は、幅の小さい移動平均を用いて求めることができる。また、幅の小さい移動平均を用いて幅の大きい移動平均を求めた時の計算量は、画素の値を順に追加していった時の計算量より少なくすることができる。たとえば、幅7の移動平均は、既に幅3の移動平均を生成していれば、4回の計算で済む。
以上より、図6で説明した移動平均について、TMP[i]は、IN[Y][i−2]、IN[Y][i−1]、IN[Y][i]という3つの画素の平均値となる。このように、図6で求めたTMP[i]は、x座標が同一の画素の値と、x軸の負の方向にある隣の画素と、さらに隣の画素との平均値となっている。図6で説明した移動平均では、移動平均の処理を単純化するために、移動平均の幅が大きくなる都度、x軸の正の方向にある隣の画素を次々に追加している。x軸の正の方向にある隣の画素を次々に追加する処理は、正の方向にある隣の画素を追加し、次は負の方向にある隣の画素を追加し、という処理に比べて、処理内容が単純となる。
しかし、図5では、画素OUT[Y+3][i]は、IN[Y][i−1]、IN[Y][i]、IN[Y][i+1]、という、x座標が同一の画素の値と、同一の画素のx軸方向の両隣の画素の移動平均を追加するということを説明している。このように、画素OUT[Y+3][i]に影響を与える画素とTMP[i]に影響を与える画素が図5と図6でずれている。辻褄を合わせるため、画像変換装置100は、TMPを画素OUT[Y+3]に追加する場合、TMPをずらして追加する。TMPの追加の動作例を、図7にて説明する。
図7は、画像変換処理の動作例を示す説明図(その3)である。図7では、幅3の移動平均TMPを追加する際の例を示す。画像変換装置100は、絞り形状テーブル310の幅3となるレコード401−3を参照して、TMPの各画素の値を、OUT[Y+3]に追加する。このとき、画像変換装置100は、TMPを、レコード401−3のxフィールドの値となる−1画素分オフセットして、OUT[Y+3]に追加する。たとえば、画像変換装置100は、OUT[Y+3][i]に、TMP[i+1]の値を追加する。図6の説明より、TMP[i+1]は、IN[Y][i−1]、IN[Y][i]、IN[Y][i+1]という3つの画素の平均値であったため、図5にて説明した移動平均を追加することができたことになる。
続けて、画像変換装置100は、TMPの各画素の値を、OUT[Y−3]にも追加する。このように、画像変換装置100は、ある幅の移動平均を追加する行が複数ある場合、ある幅の移動平均の結果を複数の行に追加することになるため、画素ごとに影響を与える画素を追加していく方法より計算量を少なくすることできる。次に、図8〜図13を用いて、図5〜図7にて説明した動作を行うフローチャートについて説明する。
図8は、x軸方向に走査する場合の画像変換処理手順の一例を示すフローチャートである。画像変換処理は、元画像をぼかし画像に変換する処理である。始めに、画像変換装置100は、絞り形状テーブル310を参照して、指定された絞り形状に応じた走査方向を選択する(ステップS801)。続けて、画像変換装置100は、初期化処理を実行する(ステップS802)。初期化処理は、走査方向に応じて処理内容の一部が変化する。x軸方向に走査する場合の初期化処理の詳細については、図9にて説明する。
次に、画像変換装置100は、1走査線に対する、光エネルギ値変換処理を実行する(ステップS803)。光エネルギ値変換処理は、走査方向によって処理内容が異なる。x軸方向に走査する場合の光エネルギ値変換処理の詳細については、図10にて説明する。
次に、画像変換装置100は、1走査線に対する、光拡散処理を実行する(ステップS804)。光拡散処理は、走査方向によって処理内容が異なる。x軸方向に走査する場合の光拡散処理の詳細については、図11、図12にて説明する。
続けて、画像変換装置100は、全ての走査線に対して処理したか否かを判断する(ステップS805)。ステップS805の具体的な処理は、走査方向によって異なる。具体的な処理内容は、それぞれ図12、図21、図26にて説明する。まだ処理していない走査線がある場合(ステップS805:No)、画像変換装置100は、ステップS803の処理に移行する。全ての走査線に対して処理した場合(ステップS805:Yes)、画像変換装置100は、RGB値変換処理を実行する(ステップS806)。RGB値変換処理については、図13にて説明する。
ステップS806の実行終了後、画像変換装置100は、画像変換処理を終了する。画像変換処理を実行することにより、画像変換装置100は、元画像からぼかし画像を変換することができる。
図9は、x軸方向に走査する場合の初期化処理手順の一例を示すフローチャートである。x軸方向に走査する場合の初期化処理は、x軸方向に走査する場合に、画像変換処理で用いる変数、配列、構造体を初期化する処理である。
なお、図9に示すフローチャートで用いる元画像は、グレースケールでもよいし、RGB3つの数値を持つ構造体でもよい。元画像がRGB3つの数値を持つ場合、画像変換装置100は、元画像となるINやぼかし画像となるOUTへの処理、後述する光エネルギ値ENGや一時記憶領域LINE1、LINE2への処理をRGB合わせて三回行ってもよい。
始めに、画像変換装置100は、元画像の各画素をIN[H][W]という二次元配列に格納する(ステップS901)。次に、画像変換装置100は、ぼかし画像の各画素を格納する二次元配列として、OUT[H][W]を確保する(ステップS902)。続けて、画像変換装置100は、絞り形状テーブル310の各レコードの値を、TBL[S]という構造体の配列に格納する(ステップS903)。Sは、絞り形状テーブル310のレコード数が格納された定数である。
具体的に、構造体TBLは、x、y、wという3つの要素を持つ。また、画像変換装置100は、W+TBL[S−1].wの値をW2という変数に格納する(ステップS904)。絞り形状テーブル310には、wの小さい順に格納されているため、任意の整数N(N<S)に対し常にTBL[N−1].w≦TBL[N].wが成り立つ。したがって、TBL[S−1].wは、wの最大値となる。
次に、画像変換装置100は、光エネルギ値を記憶する二次元配列ENG[H][W]を0で初期化する(ステップS905)。同様に、画像変換装置100は、各画素に光エネルギ値が追加された回数を示す二次元配列CNT[H][W]を0で初期化する(ステップS906)。続けて、画像変換装置100は、最初に処理する画素列として、Yに0を格納する(ステップS907)。ステップS907の実行終了後、画像変換装置100は、x軸方向に走査する場合の初期化処理を終了する。x軸方向に走査する場合の初期化処理を実行することにより、画像変換装置100は、画像変換処理で用いる変数、配列、構造体を初期化できる。
図10は、x軸方向に走査する場合の光エネルギ値変換処理手順の一例を示すフローチャートである。x軸方向に走査する場合の光エネルギ値変換処理は、x軸方向に走査する場合に、1走査線分となる一行分の画素の値について、RGB値から光エネルギ値に変換する処理である。
始めに、画像変換装置100は、Xを0に初期化する(ステップS1001)。次に、画像変換装置100は、IN[Y][X]の光エネルギ値を算出し、光エネルギ値を変数eに格納する(ステップS1002)。具体的な光エネルギ値の算出式として、たとえば、画像変換装置100は、下記(1)式を用いて、RGB値から光エネルギ値を算出する。
光エネルギ値=exp(IN[Y][X]/k−b) …(1)
ただし、kとbは定数である。たとえば、k=40、b=−4.5となる。expは、自然体数の底を引数でべき乗した値を返す関数である。光エネルギ値は何度も利用するため、大きさがWとなるLINE1と、大きさがW2となるLINE2という配列を確保する。具体的に、画像変換装置100は、eの値を一時記憶領域となるLINE1[X]とLINE2[X]に格納する(ステップS1003)。LINE1[X]とLINE2[X]には、幅1の移動平均が格納されたことになる。以降の処理にて、LINE2は、幅2、幅3、…、の移動平均を格納していくことになり、LINE1は、幅1の移動平均を持ち続けることになる。
続けて、画像変換装置100は、大きさW2の配列LCNTのLCNT[X]に1を格納する(ステップS1004)。LCNTは、LINE2の各要素が何回足されたかを示す変数である。次に、画像変換装置100は、Xの値をインクリメントする(ステップS1005)。続けて、画像変換装置100は、XがWより小さいか否かを判断する(ステップS1006)。XがWより小さい場合(ステップS1006:Yes)、画像変換装置100は、ステップS1002の処理に移行する。XがW以上である場合(ステップS1006:No)、LINE2とLCNTはWより大きなW2の大きさを持つため、画像変換装置100は、LINE2[X]に0を格納する(ステップS1007)。さらに、画像変換装置100は、LCNT[X]に0を格納する(ステップS1008)。
次に、画像変換装置100は、Xの値をインクリメントする(ステップS1009)。続けて、画像変換装置100は、XがW2より小さいか否かを判断する(ステップS1010)。XがW2より小さい場合(ステップS1010:Yes)、画像変換装置100は、ステップS1007の処理に移行する。XがW2以上である場合(ステップS1010:No)、画像変換装置100は、x軸方向に走査する場合の光エネルギ値変換処理を終了する。x軸方向に走査する場合の光エネルギ値変換処理を実行することにより、画像変換装置100は、1走査線分となる一行分の画素の光エネルギ値を得ることができる。
図11は、x軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その1)である。x軸方向に走査する場合の光拡散処理は、x軸方向に走査する場合に、1走査線分となる一行分の各画素の光エネルギ値を拡散していく処理である。具体的に、図11に示すフローチャートでは、移動平均を求めることにより、一行分の各画素の光エネルギ値をx軸方向に拡散する処理であり、図11に示すフローチャートでは、各画素の光エネルギ値をy軸方向に拡散する処理である。
画像変換装置100は、移動平均の幅を示すZに1を格納する(ステップS1101)。次に、画像変換装置100は、絞り形状テーブル310の処理中のレコードのインデックスを示すIに0を格納する(ステップS1102)。Iを指定することにより、画像変換装置100は、元画像INから第1の画素列を抽出することになる。ステップS1102の実行後、または後述する図12のステップS1211:Yesとなった後、画像変換装置100は、Xに0を格納する(ステップS1103)。次に、画像変換装置100は、LINE2に、追加する画素のオフセット値を示すJにZの値を格納する(ステップS1104)。
まずぶれ量が増加したかを確認するため、画像変換装置100は、JがTBL[I].wより小さいか否かを判断する(ステップS1105)。JがTBL[I].wより小さい場合(ステップS1105:Yes)、画像変換装置100は、Jの値をインクリメントする(ステップS1106)。Jの値が更新されたことにより、画像変換装置100は、X+Jで指定されるIN[Y][X+J]を、第1の画素や第2の画素に影響を与える拡散元画素として特定している。したがって、画像変換装置100は、LINE2[X+J]とLINE1[X]との加算結果を、LINE2[X+J]に格納する(ステップS1107)。続けて、画像変換装置100は、LCNT[X+J]の値をインクリメントする(ステップS1108)。次に、画像変換装置100は、ステップS1105の処理に移行する。
JがTBL[I].w以上である場合(ステップS1105:No)、画像変換装置100は、Xの値をインクリメントする(ステップS1109)。次に、画像変換装置100は、XがWより小さいか否かを判断する(ステップS1110)。XがWより小さい場合(ステップS1110:Yes)、画像変換装置100は、ステップS1104の処理に移行する。XがW以上である場合(ステップS1110:No)、画像変換装置100は、ZにTBL[I].wの値を格納する(ステップS1111)。続けて、画像変換装置100は、図12に示すステップS1201の処理に移行する。
図12は、x軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その2)である。LINE2を縦方向にどれだけオフセットして加算するかは TBL[I].y にて示されるため、画像変換装置100は、加算すべき行を示すY2に、YとTBL[I].yとの加算結果を格納する(ステップS1201)。次に、画像変換装置100は、Y2が0未満であるか、またはY2がH以上であるか否かを判断する(ステップS1202)。ステップS1202の処理は、Y2が画面内にあるかを確認する処理となる。また、図12のステップS1202で用いた「||」は、論理和を算出する演算子である。
Y2が0以上であり、かつY2がH未満である場合(ステップS1202:No)、画像変換装置100は、Xに0を格納する(ステップS1203)。次に、画像変換装置100は、参照する画素のx座標の位置を示すX2に、XとTBL[I].xの加算結果を格納する(ステップS1204)。TBL[I].xは、ぶれ開始位置となる左端の画素のx行における位置が格納されているため、画像変換装置100は、左端の画素からの画素数を取得することになる。続けて、画像変換装置100は、X2が0より小さいか、またはX2がW2以上であるか否かを判断する(ステップS1205)。ステップS1205の処理は、X2が画面内にあるかを確認する処理となる。
X2が0以上であり、かつX2がW2未満である場合(ステップS1205:No)、画像変換装置100は、ENG[Y2][X]とLINE2[X2]の加算結果を、ENG[Y2][X]に格納する(ステップS1206)。さらに、画像変換装置100は、CNT[Y2][X]とLCNT[X2]の加算結果を、CNT[Y2][X]に格納する(ステップS1207)。
ステップS1207の処理後か、Y2が0未満であるかまたはY2がH以上である場合か(ステップS1202:Yes)、X2が0より小さいかまたはX2がW2以上である場合(ステップS1205:Yes)、画像変換装置100は、Xの値をインクリメントする(ステップS1208)。続けて、画像変換装置100は、XがWより小さいか否かを判断する(ステップS1209)。XがWより小さい場合(ステップS1209:Yes)、画像変換装置100は、ステップS1204の処理に移行する。
XがW以上である場合(ステップS1209:No)、画像変換装置100は、Iの値をインクリメントする(ステップS1210)。Iの値をインクリメントすることにより、画像変換装置100は、元画像INから、絞り形状と連続して重なる画素数が第1の画素列以上の第2の画素列を抽出することになる。次に、画像変換装置100は、IがSより小さいか否かを判断する(ステップS1211)。IがSより小さい場合(ステップS1211:Yes)、画像変換装置100は、図11のステップS1103に移行する。IがS以上である場合(ステップS1211:No)、画像変換装置100は、Yの値をインクリメントする(ステップS1212)。ステップS1212の処理後、画像変換装置100は、x軸方向に走査する場合の光拡散処理を終了する。
x軸方向に走査する場合の光拡散処理の終了後、画像変換装置100は、ステップS805の処理となる、YがH未満であるか否かを判断することにより、「全ての走査線に対して処理したか」を判断する。YがH未満であれば、まだ処理していない走査線があることになり、画像変換装置100は、ステップS805:Noの処理を実行する。また、YがH以上であれば、全ての走査線に対して処理したことになり、ステップS805:Yesの処理を実行する。
x軸方向に走査する場合の光拡散処理を実行することにより、画像変換装置100は、1走査線分となる一行分の各画素の光エネルギ値を、x方向とy方向に拡散させることができる。
図13は、RGB値変換処理手順の一例を示すフローチャートである。RGB値変換処理は、光エネルギ値からRGB値に変換する処理である。なお、RGB値変換処理に至った段階にて、光エネルギ値ENGと、ENGの各要素が何回足された値かを示す情報CNTとが完成されている。
始めに、画像変換装置100は、Yに0を格納する(ステップS1301)。次に、画像変換装置100は、Xに0を格納する(ステップS1302)。次に、画像変換装置100は、ENG[Y][X]をCNT[Y][X]で除算した除算結果を、eに格納する(ステップS1303)。ステップS1303の処理により、追加された光エネルギ値の平均を求めることができる。続けて、画像変換装置100は、eのRGB値をOUT[Y][X]に格納する(ステップS1304)。具体的なRGB値の算出式として、たとえば、画像変換装置100は、下記(2)式を用いて、光エネルギ値からRGB値を算出する。
RGB値=k(b+log(e)) …(2)
ただし、kとbは、(1)式と同一の定数である。logは、引数の自然対数を返す関数である。次に、画像変換装置100は、Xの値をインクリメントする(ステップS1305)。続けて、画像変換装置100は、XがWより小さいか否かを判断する(ステップS1306)。XがWより小さい場合(ステップS1306:Yes)、画像変換装置100は、ステップS1303の処理に移行する。XがW以上である場合(ステップS1306:No)、画像変換装置100は、Yの値をインクリメントする(ステップS1307)。次に、画像変換装置100は、YがHより小さい否かを判断する(ステップS1308)。YがHより小さい場合(ステップS1308:Yes)、画像変換装置100は、ステップS1302の処理に移行する。YがH以上である場合(ステップS1308:No)、画像変換装置100は、RGB値変換処理を終了する。RGB値変換処理を実行することにより、画像変換装置100は、ぼかし画像を得ることができる。
以上、図4〜図13では、絞り形状テーブル310を用いて画像変換処理を行う例について説明している。画像変換装置100は、絞り形状テーブル310を用いずに画像変換処理を実行することもできる。以下、図14〜図16を用いて、絞り形状テーブル310を用いない場合の画像変換処理について説明する。
図14は、絞り形状テーブルを用いない場合の画像変換処理の動作例を示す説明図である。図14の(A)では、絞り形状1400が6角形となる場合の例を示している。ぶれ量wは、XとYとの関係によって求められる。絞り形状1400の一辺をSとする。したがって、wの最大値は、(√3)・Sとなる。ここで、(√x)は、xの正の平方根を示す。また、斜辺1401のxとyの関係式は、y=−(√3)/3x+Sとなり、斜辺1402のxとyの関係式は、y=(√3)/3x+Sとなる。YがS/2以上である場合、xは、−(√3)(S−y)となる。また、yが0より大きくS/2未満の場合、xは、(√3)/2・Sとなる。
図14の(B)では、ぶれ量を格納する一時記憶領域LINE1の内容を示している。d=(√3)・(S−y)とすると、wは、2d+1=1−2xの大きさとなる。LINE1[0]には、x=−dにて示す画素の値が格納される。
次に、絞り形状テーブル310を用いない場合の画像変換処理のフローチャートについて説明する。絞り形状テーブル310を用いない場合の画像変換処理は、図8〜図10、図12で示したフローチャートの部分は同一となるため、説明を省略する。したがって、図15、図16を用いて、絞り形状テーブル310を用いない場合の光拡散処理のフローチャートについて説明する。
図15は、絞り形状テーブルを用いない場合の光拡散処理手順の一例を示すフローチャート(その1)である。図15に示すステップS1510〜ステップS1513は、図11に示したステップS1106〜ステップS1109と同一の処理であるため、説明を省略する。
始めに、画像変換装置100は、移動平均の幅を示すZに1を格納する(ステップS1501)。次に、画像変換装置100は、絞り形状内の処理する対象行を示す変数Iに2Sの算出結果を格納する(ステップS1502)。Iが偶数となる場合、処理行がS/2行より上であり、Iが奇数である場合、処理行が(S+1)/2行以下を示すものとする。
ステップS1502の処理が終了した場合、または図16にて後述するステップS1611の処理が終了した場合、画像変換装置100は、Iが奇数か否かを判断する(ステップS1503)。Iが偶数である場合(ステップS1503:No)、画像変換装置100は、今の行と影響を与える行の相対位置を示す変数yにI/2の算出結果を格納する(ステップS1504)。次に、画像変換装置100は、yがS/2以下か否かを判断する(ステップS1505)。yがS/2以下である場合(ステップS1505:Yes)、画像変換装置100は、ぶれ開始位置を示すxに−(√3)(S−y)の算出結果を格納する(ステップS1506)。続けて、画像変換装置100は、ぶれ量となるwに、1−2xの算出結果を格納する(ステップS1507)。
次に、画像変換装置100は、JにZの値を格納する(ステップS1508)。続けて、画像変換装置100は、Jがwより小さいか否かを判断する(ステップS1509)。Jがwより小さい場合(ステップS1509:Yes)、画像変換装置100は、ステップS1510の処理に移行する。Jがw以上である場合(ステップS1509:No)、画像変換装置100は、ステップS1513の処理に移行する。
ステップS1513の処理終了後、画像変換装置100は、XがWより小さいか否かを判断する(ステップS1514)。XがWより小さい場合(ステップS1514:Yes)、画像変換装置100は、ステップS1508の処理に移行する。XがW以上である場合(ステップS1514:No)、画像変換装置100は、Zにwの値を格納する(ステップS1515)。Iが奇数である場合(ステップS1503:Yes)、画像変換装置100は、yに−yの値を格納する(ステップS1516)。
ステップS1515、またはステップS1516の終了後か、yがS/2以下でない場合(ステップS1505:No)、画像変換装置100は、図16に示すステップS1601の処理に移行する。
図16は、絞り形状テーブルを用いない場合の光拡散処理手順の一例を示すフローチャート(その2)である。図16に示す各ステップのうちの、ステップS1601、ステップS1604、ステップS1610、ステップS1611が、図12で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理から置き換わっている。他のステップについては図12で説明した処理と同一であるため、説明を省略する。
始めに、画像変換装置100は、Y2にYとyの加算結果を格納する(ステップS1601)。ステップS1603の処理終了後、画像変換装置100は、X2にXとxの加算結果を格納する(ステップS1604)。ステップS1609:Noとなった場合、画像変換装置100は、Iの値をデクリメントする(ステップS1610)。続けて、画像変換装置100は、Iが0以上であるか否かを判断する(ステップS1611)。Iが0以上である場合(ステップS1611:Yes)、画像変換装置100は、図15に示したステップS1503の処理に移行する。Iが0未満である場合(ステップS1611:No)、画像変換装置100は、ステップS1612の処理に移行する。
(y軸方向に走査する例)
以上、図4〜図16では、x軸方向に走査する場合の画像生成処理について説明した。画像変換装置100は、y軸方向に走査して、画像変換処理を行ってもよい。以下、図17〜図21を用いて、y軸方向に走査する場合の画像変換処理について説明する。
図17は、絞り形状の第2の例と絞り形状テーブルの記憶内容の第2の例を示す説明図である。図17の(A)では、xy平面上での絞り形状1700を示している。図17に示すように、絞り形状1700は、ハート型の形状をしている。絞り形状1700は、x軸方向に走査すると、複数の領域に分かれることになる。図17の(B)では、絞り形状1700を、x軸方向に走査する場合の絞り形状テーブル310_xの記憶内容の例を示している。絞り形状テーブル310_xは、レコード1701−1〜レコード1701−11を記憶している。また、絞り形状テーブル310_xは、走査方向としてx軸方向を関連付けて記憶している。x軸方向に走査する場合、y=3における走査線と、y=4における走査線が、複数の部分に分かれることになる。このように走査線が複数に分かれても、図8〜図13にて示したフローチャートで実行することができる。
また、図17の(C)では、絞り形状1700を、y軸方向に走査する場合の絞り形状テーブル310_yの記憶内容の例を示している。絞り形状テーブル310_yは、レコード1702−1〜レコード1702−9を記憶している。また、絞り形状テーブル310_yは、走査方向としてy軸方向を関連付けて記憶している。y軸方向に走査する場合、走査線が複数の部分に分かれることがなくなる。したがって、絞り形状テーブル310_yのレコード数は、絞り形状テーブル310_xより少なくなる。レコード数が少ないと、ループの回数が少なくなるため、処理量を減少することができる。
次に、y軸方向に走査する場合の画像変換処理のフローチャートについて説明する。y軸方向に走査する場合の画像変換処理は、図13で示したRGB値変換処理のフローチャートの部分は同一となるため、説明を省略する。以下、図18〜図21において、y軸方向に走査する場合の、初期化処理、光エネルギ値変換処理、光拡散処理について説明する。
図18は、y軸方向に走査する場合の初期化処理手順の一例を示すフローチャートである。y軸方向に走査する場合の初期化処理は、y軸方向に走査する場合に、画像変換処理で用いる変数、配列、構造体を初期化する処理である。また、図18で示すステップS1804、ステップS1807が、図9で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理から置き換わっている。他のステップについては図9で説明した処理と同一であるため、説明を省略する。
ステップS1803の処理終了後、画像変換装置100は、HとTBL[S−1].wの加算結果を、H2という変数に格納する(ステップS1804)。また、ステップS1806の処理終了後、画像変換装置100は、最初に処理する画素列として、Xに0を格納する(ステップS1807)。
図19は、y軸方向に走査する場合の光エネルギ値変換処理手順の一例を示すフローチャートである。y軸方向に走査する場合の光エネルギ値変換処理は、y軸方向に走査する場合に、1走査線分となる一列分の画素の値について、RGB値から光エネルギ値に変換する処理である。また、図19で示す各ステップのうち、ステップS1901、ステップS1903〜ステップS1910は、図10で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理の「X」が「Y」に置き換わっている。さらに、ステップS1906は、ステップS1006の「W」が「H」に置き換わっている。さらに、ステップS1910は、ステップS1010の「W2」が「H2」に置き換わっている。前述以外の変更点はないため、各ステップの説明を省略する。
図20は、y軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その1)である。y軸方向に走査する場合の光拡散処理は、y軸方向に走査する場合に、1走査線分となる一列分の各画素の光エネルギ値を拡散していく処理である。また、図20で示す各ステップのうち、ステップS2003、ステップS2007〜ステップS2010は、図11で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理の「X」が「Y」に置き換わっている。さらに、ステップS2010は、ステップS1110の「W」が「H」に置き換わっている。前述以外の変更点はないため、各ステップの説明を省略する。
図21は、y軸方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その2)である。図21で示す各ステップのうち、ステップS2103、ステップS2108、ステップS2109、ステップS2112は、図12で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理の「X」が「Y」に置き換わっている。さらに、ステップS2109は、ステップS1209の「W」が「H」に置き換わっている。さらに、ステップS2101、ステップS2102、ステップS2104、ステップS2105について、図12で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理から変更しているため、説明を行う。ステップS2106、ステップS2107については、ステップS1206、ステップS1207と同一の処理であるため、説明を省略する。
始めに、画像変換装置100は、X2に、XとTBL[I].xの加算結果を格納する(ステップS2101)。次に、画像変換装置100は、X2が0未満であるか、またはX2がW以上であるか否かを判断する(ステップS2102)。X2が0以上であり、かつX2がW未満である場合(ステップS2102:No)、画像変換装置100は、ステップS2103の処理に移行する。X2が0未満であるかまたはX2がW以上である場合(ステップS2102:Yes)、画像変換装置100は、ステップS2108の処理に移行する。
ステップS2103の実行終了後、画像変換装置100は、Y2に、YとTBL[I].yの加算結果を格納する(ステップS2104)。続けて、画像変換装置100は、XY2が0より小さいか、またはY2がH2以上であるか否かを判断する(ステップS2105)。Y2が0以上であり、かつY2がH2未満である場合(ステップS2105:No)、画像変換装置100は、ステップS2106の処理に移行する。また、Y2が0より小さいかまたはY2がH2以上である場合(ステップS2105:Yes)、ステップS2108の処理に移行する。
また、y軸方向に走査する場合の光拡散処理の終了後、画像変換装置100は、ステップS805の処理となる、XがW未満であるか否かを判断することにより、「全ての走査線に対して処理したか」を判断する。XがW未満であれば、まだ処理していない走査線があることになり、画像変換装置100は、ステップS805:Noの処理を実行する。また、XがW以上であれば、全ての走査線に対して処理したことになり、ステップS805:Yesの処理を実行する。
(斜め方向に走査する例)
以上、図17〜図21では、y軸方向に走査する場合の画像生成処理について説明した。画像変換装置100は、x軸やy軸方向とは斜めの走査を行って、画像変換処理を行ってもよい。以下、図22〜図29を用いて、斜め方向の一例として、Y=−X方向に走査する場合の画像変換処理について説明する。なお、図22〜図29での説明では、説明の簡略化のため、H>Wであることを前提とする。
図22は、Y=−X方向に走査する場合の画像変換処理の動作例を示す説明図である。図22の(A)は、横方向および縦方向よりY=−X方向に走査した方がよい絞り形状2200を示している。図22には図示していないが、絞り形状2200を記憶している絞り形状テーブル310は、走査方向としてY=−X方向を関連付けて記憶している。図22の(B)は、斜め方向に走査する場合の変数が示す位置を示している。Pは、現在の走査方向の画素列に含まれる画素数を示す。Qは、画素列内の対象となる画素の画素数を示す。Rは、画素列のインデックスを示している。
図22の(C)は、元画像INが、W=4、H=6とした場合の、各画素のRとQの値を示している。たとえば、IN[4][1]は、R=6であり、Q=1となる。また、画素列R=6となる画素は、IN[5][0]、IN[4][1]、IN[3][2]、IN[2][3]の4つであるから、Pは4となる。
図22の(D)は、Rと、加算すべき画素列のインデックスを示すR2と、オフセットRoの位置を示している。また、図22の(E)は、元画像INが、W=4、H=6とした場合の、R、R2、Roの関係を示している。R=3、R2=4である場合、Roは、−1となる。
次に、Y=−X方向に走査する場合の画像変換処理のフローチャートについて説明する。Y=−X方向に走査する場合の画像変換処理は、図13で示したRGB値変換処理のフローチャートの部分は同一となるため、説明を省略する。以下、図23〜図26において、Y=−X方向に走査する場合の、初期化処理、光エネルギ値変換処理、光拡散処理について説明する。
図23は、Y=−X方向に走査する場合の初期化処理手順の一例を示すフローチャートである。Y=−X方向に走査する場合の初期化処理は、Y=−X方向に走査する場合に、画像変換処理で用いる変数、配列、構造体を初期化する処理である。また、図23で示すステップS2307が、図9で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理から置き換わっている。他のステップについては図9で説明した処理と同一であるため、説明を省略する。ステップS2306の処理終了後、画像変換装置100は、Rに0を格納する(ステップS2307)。
図24は、Y=−X方向に走査する場合の光エネルギ値変換処理手順の一例を示すフローチャートである。Y=−X方向に走査する場合の光エネルギ値変換処理は、Y=−X方向に走査する場合に、1走査線分となる画素群の各画素の値について、RGB値から光エネルギ値に変換する処理である。また、図24で示す各ステップのうち、ステップS2405〜ステップS2412は、図10のステップS1003〜ステップS1010のうちの、ステップ番号の下2けたが2小さい番号の処理の「X」が「Q」に置き換わっている。さらに、ステップS2408は、ステップS1006の「W」が「P」に置き換わっている。
始めに、画像変換装置100は、Rを引数としてP取得処理を実行する(ステップS2401)。P取得処理の詳細は、図27にて後述する。次に、画像変換装置100は、Qに0を格納する(ステップS2402)。続けて、画像変換装置100は、R、Qを引数として、X・Y取得処理を実行する(ステップS2403)。
図25は、Y=−X方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その1)である。Y=−X方向に走査する場合の光拡散処理は、Y=−X方向に走査する場合に、1走査線分となる画素群の各画素の光エネルギ値を拡散していく処理である。また、また、図25で示す各ステップのうち、ステップS2503、ステップS2507〜ステップS2510は、図11で説明した各ステップのうちの、ステップ番号の下2けたが同一番号の処理の「X」が「Q」に置き換わっている。さらに、ステップS2510は、ステップS1110の「W」が「P」に置き換わっている。前述以外の変更点はないため、各ステップの説明を省略する。
図26は、Y=−X方向に走査する場合の光拡散処理手順の一例を示すフローチャート(その2)である。図26で示す各ステップのうち、ステップS2610、ステップS2611は、図12で説明したステップS1208、ステップS1209の処理の「X」が「Q」に置き換わっている。さらに、ステップS2614は、ステップS1212の「Y」が「R」に置き換わっている。ステップS2607〜ステップS2609、ステップS2613の処理は、図12で示したステップS1205〜ステップS1207、ステップS1211の処理と同一であるため、説明を省略する。以下、ステップS2601〜ステップS2606について、説明を行う。
ステップS2511の実行終了後、画像変換装置100は、RとTBL[I].yとの加算結果をR2に格納する(ステップS2601)。次に、画像変換装置100は、R、R2を引数としてRo取得処理を実行する(ステップS2602)。Ro取得処理の詳細は、図29にて説明する。続けて、画像変換装置100は、Qに0を格納する(ステップS2603)。次に、画像変換装置100は、QとTBL[I].xとRoとの加算結果を、Q2に格納する(ステップS2604)。続けて、画像変換装置100は、R2、Q2を引数としてX・Y取得処理を実行する(ステップS2605)。R2、Q2を引数としてX・Y取得処理を実行することにより、画像変換装置100は、X2、Y2を取得できる。
次に、画像変換装置100は、Y2が0より小さいか、またはY2がH以上か否かを判断する(ステップS2606)。Y2が0以上であり、かつY2がH未満である場合(ステップS2606:No)、画像変換装置100は、ステップS2607の処理に移行する。Y2が0より小さいか、またはY2がH以上である場合(ステップS2606:Yes)、画像変換装置100は、ステップS2610の処理に移行する。
また、Y=−X方向に走査する場合の光拡散処理の終了後、画像変換装置100は、ステップS805の処理となる、RがHとWの加算結果未満であるか否かを判断することにより、「全ての走査線に対して処理したか」を判断する。RがHとWの加算結果未満であれば、まだ処理していない走査線があることになり、画像変換装置100は、ステップS805:Noの処理を実行する。また、RがHとWの加算結果以上であれば、全ての走査線に対して処理したことになり、ステップS805:Yesの処理を実行する。
図27は、P取得処理手順の一例を示すフローチャートである。P取得処理は、Rを引数として、Pの値を出力する処理である。画像変換装置100は、RがWより小さいか否かを判断する(ステップS2701)。RがWより小さい場合(ステップS2701:Yes)、画像変換装置100は、PにRの値を格納する(ステップS2702)。RがW以上である場合(ステップS2701:No)、続けて、画像変換装置100は、RがHより大きいか否かを判断する(ステップS2703)。RがH以下である場合(ステップS2703:No)、画像変換装置100は、PにWの値を格納する(ステップS2704)。RがHより大きい場合(ステップS2703:Yes)、画像変換装置100は、Pに、WとHの加算結果に、Rを引いた結果を格納する(ステップS2705)。
ステップS2702の処理か、ステップS2704の処理か、ステップS2705の処理かのいずれかを実行した後、画像変換装置100は、P取得処理を終了する。P取得処理を実行することにより、画像変換装置100は、Pの値を取得することができる。
図28は、X・Y取得処理手順の一例を示すフローチャートである。X・Y取得処理は、R、Qを引数として、X、Yの値を出力する処理である。画像変換装置100は、RがH以下か否かを判断する(ステップS2801)。RがH以下である場合(ステップS2801:Yes)、画像変換装置100は、XにQの値を格納する(ステップS2802)。続けて、画像変換装置100は、RからQを引いた結果をYに格納する(ステップS2803)。
RがHより大きい場合(ステップS2801:No)、画像変換装置100は、Q+Rの加算結果から、Hを引いた減算結果を、Xに格納する(ステップS2804)。続けて、画像変換装置100は、HからQを引いた減算結果をYに格納する(ステップS2805)。ステップS2803の処理か、ステップS2805の処理かを実行した後、画像変換装置100は、X・Y取得処理を終了する。X・Y取得処理を実行することにより、画像変換装置100は、XとYの値を取得することができる。
図29は、Ro取得処理手順の一例を示すフローチャートである。Ro取得処理は、R、R2を引数として、Roの値を出力する処理である。画像変換装置100は、RがH以下か否かを判断する(ステップS2901)。RがH以下である場合(ステップS2901:Yes)、続けて、画像変換装置100は、R2がH以下か否かを判断する(ステップS2902)。R2がH以下である場合(ステップS2902:Yes)、画像変換装置100は、RからR2を引いた減算結果をRoに格納する(ステップS2903)。
RがH以下でない場合(ステップS2901:No)、続けて、画像変換装置100は、R2がH以下か否かを判断する(ステップS2904)。R2がHより大きい場合(ステップS2904:No)、画像変換装置100は、R2からRを引いた減算結果をRoに格納する(ステップS2905)。
R2がH以下でない場合(ステップS2902:No)、またはR2がH以下である場合(ステップS2904:Yes)、画像変換装置100は、R2とRの加算結果から、2・Hを引いた減算結果をRoに格納する(ステップS2906)。ステップS2903か、ステップS2905か、ステップS2906かの処理を実行した後、画像変換装置100は、Ro取得処理を終了する。Ro取得処理を実行することにより、画像変換装置100は、Roの値を取得することができる。
(同一の画素列を複数回走査する例)
図4〜図29では、同一の画素列を複数回走査することがなかったが、同一の画素列を複数回走査してもよい。同一の画素列を複数回走査することにより、移動平均以外の拡散を実現することができる。同一の画素列を複数回走査する例について、図30、図31を用いて説明する。
図30は、絞り形状の第3の例と絞り形状テーブルの記憶内容の第3の例を示す説明図である。図30の(A)は、四角錐状に光が拡散する場合の拡散係数を示している。中央の部分は拡散量が大きく、外側に行くにつれ、拡散量が小さくなる。図30の(B)は、四角錐状に拡散する場合の絞り形状テーブル310_pの記憶内容の一例を示す。絞り形状テーブル310_pは、レコード3001−1〜レコード3001−9を記憶している。
図31は、絞り形状の第4の例と絞り形状テーブルの記憶内容の第4の例を示す説明図である。図31の(A)は、ガウシアンブラーを行う際の光が拡散する様子を示している。図31の(B)は、ガウシアンブラーを行う際の拡散係数を示している。図31の(C)は、ガウシアンブラーを行う際の絞り形状テーブル310_gの記憶内容の一例を示す。絞り形状テーブル310_gは、レコード3101−1〜レコード3101−15を記憶している。絞り形状テーブル310_gは、x、y、wフィールドの他に、何倍で加算するという情報を格納するnフィールドを有する。
nフィールドの具体的な使用方法として、画像変換装置100は、図11のステップS1108の処理を、「CNT[Y2][X]+=LCNT[X+J]*TBL[I].n」に置き換えて実行する。さらに、画像変換装置100は、図12のステップS1206の処理を、「ENG[Y2][X]+=LINE2[X]*TBL[I].n」に置き換えて実行する。nフィールドを有することで、何度も同じフィールドを加算することがなくなるため、処理量を減らすことができる。
(光エネルギ値とRGB値の変換)
続けて、光エネルギ値とRGB値の変換の処理について説明する。ステップS1002で示したRGB値から光エネルギ値の変換処理と、ステップS1304で示した光エネルギ値からRGB値の変換処理は浮動小数点演算であるため、浮動小数点演算は整数演算と比べるとCPU負荷が高くなり、処理速度が遅くなる。したがって、RGB値から光エネルギ値の変換処理と、光エネルギ値からRGB値の変換処理とについて、整数演算で行う方法について説明する。また、(1)式、(2)式について、k=40、b=−4.5を用いて説明する。
RGB値から光エネルギ値の変換処理については、IN[Y][X]が0〜255の256通りであるため、変換テーブルを参照することで、高速に処理することができる。具体的には、画像変換装置100は、exp(n/40+4.5)について、nを0から255まで設定した際の出力値を、exptbl[n=256]に格納しておく。たとえば、xptbl=[90,92,95,97,…,52839]となる。そして、画像変換装置100は、RGB値から光エネルギ値を変換する際に、exptbl[IN[Y][X]]の値を取得する。
RGB値から光エネルギ値の変換処理については、(2)式のeが大きくなるため、変換テーブルを用意することが現実的ではなくなる。この問題は、整数型のnビット目が2のn乗を示していることを利用することにより、小さなテーブルと簡単な演算で解決できる。整数Eの最上位の非零ビット数をnとし、n−1,n−2,n−3…ビットの状態をa,b,c,…とした場合、光エネルギ値Eの値は、下記(3)式で表現できる。
E=2^n+a・2^(n−1)+b・2^(n−2)+c・2^(n−3)+… …(3)
また、(3)式は、下記(4)式のように変形できる。
E=2^n(1+a/2+b/4+c/8+…) …(4)
これにより、logEの値は、下記(5)式のように変形できる。
logE=n・log2+log(1+a/2+b/4+c/8+…) …(5)
ここで、log2は定数であるため第一項は簡単な掛け算で計算できる。一方、第二項は、a,b,c,…の個数を決定することで分解能が定まり、テーブル参照で求めることができる。log2は0.693と1以下であるため、そのままでは整数型で計算することは難しい。そこで、画像変換装置100は、適当な値としてM倍して保持し、後で割る処理を行う。同様に、画像変換装置100は、(log(1+a/2+b/4+…))のテーブルも同じ倍率で作りまとめて割る処理を行う。logEの演算ができたら、輝度Dは簡単に求めることができる。次に、図32にて、前述したアルゴリズムに従ったフローチャートを示す。図32にて示すフローチャートでは、k=40,b=−4.5,M=4とし、logテーブルの大きさを32として説明する。
図32は、光エネルギ値からRGB値への変換処理手順の一例を示すフローチャート(その1)である。光エネルギ値からRGB値への変換処理は、光エネルギ値からRGB値を出力する処理である。光エネルギ値からRGB値への変換処理を実行する前に、画像変換装置100は、log(1+n/32)*40*4について、nを0から31まで設定した際の出力値をlogtbl[n=32]に格納しておく。変換処理の1番目として、画像変換装置100は、まず光エネルギ値Eを(1+e/32)・2^mという形式に表現しなおす処理を行う。
始めに、画像変換装置100は、乗数mに0を格納する(ステップS3201)。さらに、画像変換装置100は、2^mを示す変数kに1を格納する(ステップS3202)。続けて、画像変換装置100は、Eがk以上か否かを判断する(ステップS3203)。Eがk未満である場合(ステップS3203:No)、画像変換装置100は、mの値をインクリメントする(ステップS3204)。さらに、画像変換装置100は、kを1ビット左シフトした結果をkに格納する(ステップS3205)。なお、図32のステップS3205で示した"<<="は、右辺分のビット数で左辺を左シフトした値を、左辺に代入する演算子である。ステップS3205の処理終了後、画像変換装置100は、ステップS3203の処理に移行する。
Eがk以上である場合(ステップS3203:Yes)、2^mがEより大きいため、画像変換装置100は、mの値をデクリメントする(ステップS3206)。ステップS3206まで処理を実行することによりmが得られた。引き続き、図33にて、eを求める。
図33は、光エネルギ値からRGB値への変換処理手順の一例を示すフローチャート(その2)である。画像変換装置100は、eにEの値を格納する(ステップS3301)。次に、ステップS3302〜ステップS3305の処理は、eのm−1ビットから下5ビットで表現される整数を取り出す処理である。
ステップS3301の実行終了後、画像変換装置100は、mが5未満であるか否かを判断する(ステップS3302)。ステップS3302の処理は、eが二進数でいう6桁以上の数かどうかを判定する処理となる。なお、mは0,1,2,…と数えているため桁数はm+1で表現される。
mが5以上である場合(ステップS3302:No)、画像変換装置100は、m−5ビット分eを右シフトした値を、eに格納する(ステップS3303)。ステップS3303の処理により、eのm−1ビット目が5桁目になる。また、図33のステップS3303で示した">>="は、右辺分のビット数で左辺を右シフトした値を、左辺に代入する演算子である。また、mが5未満である場合(ステップS3302:Yes)、画像変換装置100は、5−m分eを左シフトした値を、eに格納する(ステップS3304)。ステップS3303、またはステップS3304の処理により、eの最上位ビットが6桁目、ビット数でいうと5ビット目に存在する。
ステップS3303、またはステップS3304の処理実行後、最上位ビットを消去して下位5ビットを残すため、画像変換装置100は、eと0x1fとの論理積の結果をeに格納する(ステップS3305)。なお、図33のステップS3305で示した"&="は、右辺と左辺の論理積を左辺に代入する演算子である。
ステップS3305までの処理により、E≒(1+e/32)・2^mとした時のeとmが得られた。このEは、exp(D/40+4.5)であるため、D=40logE−180と表現できる。このlogEを先程のE=(1+e/32)・2^mを用いて整理するとDは下記(6)式のように変形できる。
D=40mlog2+40log(1+e/32)−180=(m*40*4*log2+40*4*log(1+e/32))/4−180 …(6)
(6)式のうち、40*4*log2は、おおよそ111であり、40*4*log(1+e/32)の値はテーブルlogtblに格納されている。したがって、画像変換装置100は、(m*111+logtbl[e])/4−180を計算し、計算結果を輝度dに格納する(ステップS3306)。
続けて、画像変換装置100は、輝度dが0〜255の範囲のため、ステップS3307〜ステップS3310で範囲内に収まっているか確認する。具体的には、画像変換装置100は、dが0未満か否かを判断する(ステップS3307)。dが0未満である場合(ステップS3307:Yes)、画像変換装置100は、dに0を格納する(ステップS3308)。dが0以上である場合(ステップS3307:No)、画像変換装置100は、dが255より大きいか否かを判断する(ステップS3309)。
dが255より大きい場合(ステップS3309:Yes)、画像変換装置100は、dに255を格納する(ステップS3310)。dが255以下である場合(ステップS3309:No)か、ステップS3308の処理が終了した場合か、ステップS3310の処理が終了した場合、画像変換装置100は、光エネルギ値からRGB値への変換処理を終了する。図32、図33で示したフローチャートを実行することにより、画像変換装置100は、(2)式よりも高速に変換処理を行える。
図34は、本実施の形態における画像変換処理の結果の一例を示す説明図(その1)である。図34では、絞り形状を6角形とした場合の、元画像3401_IN、元画像3402_INと、ぼかし画像3401_OUT、ぼかし画像3402_OUTを表示している。元画像3401_IN、元画像3402_INにて白い箇所が、ぼかし画像3401_OUT、ぼかし画像3402_OUTでは白い領域が6角形状に分散している。
図35は、本実施の形態における画像変換処理の結果の一例を示す説明図(その2)である。図35では、元画像3501_INと、ぼかし画像3501_5_OUT〜ぼかし画像3501_41_OUTを表示している。ぼかし画像3501_x_OUTの"x"は、絞り形状の大きさを示している。具体的に、図35には、x=5、9、13、17、21、25、29、33、37、41を表示している。元画像3501_INにて白い箇所が、絞り形状の大きさが大きくなるほど、ぼかし画像上での6角形が大きくなる。
図36は、画素ごとの画像変換処理と本実施の形態における画像変換処理との速度比較を示す説明図である。図36では、322[画素]×482[画素]を元画像とし、絞り形状を6角形にして、ぼかし画像に変換した場合の処理時間を表示している。
画素ごとの画像変換処理は、計算結果を再利用せずにぼかし画像を変換する処理である。図36上の、画素ごとの画像変換処理の処理時間を示すグラフ3601は、絞り形状の大きさが大きくなるほど、処理時間が大きくなる。たとえば、絞り形状の大きさが20[画素]である場合、画素ごとの画像変換処理の処理時間は、1200[msec]となる。本実施の形態における画像変換処理の処理結果を示すグラフ3602は、絞り形状の大きさが大きくなっても、処理時間が短いままに抑えることができる。たとえば、絞り形状の大きさが20[画素]である場合、本実施の形態における画像変換処理の処理時間は、約50[msec]となる。
以上説明したように、画像変換装置100によれば、絞り形状と重なる第1の画素列中の第1の画素の変換結果を用いて、絞り形状と重なる領域での相対位置が第1の画素と一致する第2の画素列中の第2の画素を変換する。これにより、影響を与える画素が第1の画素と第2の画素とで共通しているため、画像変換装置100は、たとえば、第1の画素の変換結果をそのまま再利用して画像変換時の計算量を減らすことができる。
また、画像変換装置100によれば、対象画素列のうちの、第1の画素が含まれるように絞り形状を移動させた際にいずれかの画素と重なる画素の値に基づいて算出した、元画像を変換した場合の第1の画素の値を用いて、変換後の第2の画素の値を算出してもよい。これにより、画像変換装置100は、再利用可能な第1の画素の変換結果を算出して、第2の画素の値の算出時に、第1の画素の変換結果を再利用することができるため、画像変換時の計算量を減らすことができる。
また、画像変換装置100によれば、元画像を変換した場合の第1の画素の値と、第2の画素が含まれるように絞り形状を移動させた際にいずれかの画素と重なる画素の値とに基づいて、変換後の第2の画素の値を算出してもよい。これにより、画像変換装置100は、第2の画素に影響を与える画素群が、第1の画素に影響を与える画素に全て含まれている場合、第1の画素の変換結果を再利用して画像変換時の計算量を減らすことができる。
また、画像変換装置100によれば、対象画素列の各々の画素ごとに、走査方向または走査方向の逆方向のいずれかの方向に向かって、各々の画素から第1の画素群の画素数分先の画素までの各画素の値に基づき、変換後の各々の画素の値を算出する。続けて、画像変換装置100は、変換後の各々の画素の値のうちの、拡散元画素からいずれかの方向の逆方向に向かって、第1の画素群のいずれかの方向にある端の画素から第1の画素までの画素数分先の位置にある画素の値を、第1の画素の値に設定してもよい。これにより、画像変換装置100は、行ごとにまとめて移動平均を算出していくため、連続した領域にアクセスすることになり、処理の高速化を図ることができる。連続した領域にアクセスできる場合、たとえば、キャッシュラインに存在している可能性が高くなるため、画像変換処理の高速化を図ることができる。
また、画像変換装置100によれば、対象画素列の各々の画素ごとに、第1の画素群の画素数を用いて算出した変換後の各々の画素の値に基づき、各々の画素から第2の画素群の画素数分先の画素までの各画素の値に基づく変換後の各々の画素の値を算出してもよい。これにより、画像変換装置100は、一度算出した移動平均を再利用できるため、計算量を削減することができる。
また、画像変換装置100によれば、ユーザが指定した形状に応じた走査方向に応じて、画像変換処理を行ってもよい。たとえば、ユーザが指定した形状がy軸に対して走査する方がx軸に対して走査する方より絞り形状テーブル310のレコード数が少なくなる場合、画像変換装置100は、走査方向としてy軸方向を選択することにより、計算量を少なくすることができる。また、x軸に対して走査する場合と、y軸に対して走査する場合とで、絞り形状テーブル310のレコード数が同一となる可能性もある。この場合、画像変換装置100は、連続した領域に処理が可能なx軸方向を走査方向として選択することにより、画像変換処理の高速化を図ることができる。
また、本実施の形態にかかる画像変換処理は、計算量が少なくなるために、スマートフォンや携帯電話といった、CPUの処理能力が非力な携帯端末が実行しても、ユーザにストレスを与えない短い時間で画像変換処理を完了することができる。また、本実施の形態にかかる画像変換処理は、パーソナル・コンピュータで実行されてもよい。たとえば、写真画像の加工を行う場合、背景と前景を切り分けることが可能な他のアプリケーションにより、背景と前景を切り分けておき、背景に対して本実施の形態にかかる画像変換処理を実行してもよい。これにより、ユーザは、カメラで撮影したようなきれいなぼかし画像を短時間で得ることができる。
なお、本実施の形態で説明した画像変換方法は、予め用意されたプログラムをパーソナル・コンピュータやワークステーション等のコンピュータで実行することにより実現することができる。本画像変換プログラムは、ハードディスク、フレキシブルディスク、CD−ROM、MO、DVD等のコンピュータで読み取り可能な記録媒体に記録され、コンピュータによって記録媒体から読み出されることによって実行される。また本画像変換プログラムは、インターネット等のネットワークを介して配布してもよい。
上述した実施の形態に関し、さらに以下の付記を開示する。
(付記1)コンピュータに、
変換対象となる画像の中の対象画素列と平行な画素列のうちの、前記対象画素列のいずれかの画素から所定範囲の画素群によって形成される領域と重なる第1の画素列と、前記領域と連続して重なる画素数が前記第1の画素列以上の第2の画素列とを抽出し、
抽出した前記第1の画素列の中の前記領域に含まれる第1の画素群のうちの前記対象画素列の走査方向または前記走査方向の逆方向のいずれかの方向にある端の画素から前記第1の画素群に含まれる第1の画素までの画素数を取得し、
抽出した前記第2の画素列の中の前記領域に含まれる第2の画素群のうちの前記いずれかの方向にある端の画素から前記いずれかの方向の逆方向に向かって、取得した前記画素数分先の位置にある第2の画素を特定し、
前記画像を変換した場合の前記第1の画素の値を記憶する記憶部を参照して、前記画像を変換した場合の前記第2の画素の値を算出する、
処理を実行させることを特徴とする画像変換プログラム。
(付記2)前記コンピュータに、
前記対象画素列の中から、前記対象画素列に平行に前記いずれかの画素を移動させた移動後の前記いずれかの画素から前記所定範囲の画素群によって形成される領域内に前記第1の画素が含まれるように、前記対象画素列に平行に前記いずれかの画素を移動させた場合の移動後の前記いずれかの画素と重なる画素を特定し、
特定した前記画素の値に基づいて、前記画像を変換した場合の前記第1の画素の値を算出する処理を実行させ、
前記第2の画素の値を算出する処理は、
算出した前記第1の画素の値に基づいて、前記画像を変換した場合の前記第2の画素の値を算出することを特徴とする付記1に記載の画像変換プログラム。
(付記3)前記コンピュータに、
前記対象画素列の中から、前記対象画素列に平行に前記いずれかの画素を移動させた移動後の前記いずれかの画素から前記所定範囲の画素群によって形成される領域内に前記第2の画素が含まれるように、前記対象画素列に平行に前記いずれかの画素を移動させた場合の移動後の前記いずれかの画素と重なる画素を特定する処理を実行させ、
前記第2の画素の値を算出する処理は、
前記画像を変換した場合の前記第1の画素の値と特定した前記画素の値とに基づいて、前記画像を変換した場合の前記第2の画素の値を算出することを特徴とする付記1または2に記載の画像変換プログラム。
(付記4)前記コンピュータに、
前記対象画素列の各々の画素ごとに、前記いずれかの方向に向かって、前記各々の画素から前記第1の画素群の画素数分の画素までの各画素の値に基づいて、前記画像を変換した場合の前記第1の画素列に関する前記各々の画素の値を算出し、
算出した前記第1の画素列に関する前記各々の画素の値のうちの、前記いずれかの画素から前記いずれかの方向の逆方向に向かって、前記第1の画素群の前記いずれかの方向にある端の画素から前記第1の画素までの画素数分先の位置にある画素の値を、前記画像を変換した場合の前記第1の画素の値に設定する処理を実行させ、
前記第2の画素の値を算出する処理は、
設定した前記第1の画素の値に基づいて、前記画像を変換した場合の前記第2の画素の値を算出することを特徴とする付記1〜3のいずれか一つに記載の画像変換プログラム。
(付記5)前記コンピュータに、
前記各々の画素ごとに、前記いずれかの方向に向かって、前記各々の画素から前記第1の画素群の画素数分先の位置にある画素の次の画素から、前記各々の画素から前記第2の画素群の画素数分まで、の各画素の値と、算出した前記第1の画素列に関する前記各々の画素の値とに基づいて、前記画像を変換した場合の前記第2の画素列に関する前記各々の画素の値を算出し、
前記第2の画素の値を算出する処理は、
算出した前記第2の画素列に関する前記各々の画素の値のうちの、前記いずれかの画素から前記いずれかの方向の逆方向に向かって、前記第1の画素群の前記いずれかの方向にある端の画素から前記第2の画素までの画素数分先の位置にある画素の値に基づいて、前記画像を変換した場合の前記第2の画素の値を算出することを特徴とする付記4に記載の画像変換プログラム。
(付記6)前記コンピュータに、
画素群によって形成される領域の形状と、走査方向とを関連付けて記憶するテーブルを参照して、指定された形状に応じた走査方向を選択し、
前記画像の中から、選択した走査方向に走査して前記対象画素列を取得する処理を実行させ、
前記対象画素列を取得した後、前記第1の画素列と前記第2の画素列とを抽出する処理を実行することを特徴とする付記1〜5のいずれか一つに記載の画像変換プログラム。
(付記7)変換対象となる画像の中の対象画素列と平行な画素列のうちの、前記対象画素列のいずれかの画素から所定範囲の画素群によって形成される領域と重なる第1の画素列と、前記領域と連続して重なる画素数が前記第1の画素列以上の第2の画素列とを抽出し、
抽出した前記第1の画素列の中の前記領域に含まれる第1の画素群のうちの前記対象画素列の走査方向または前記走査方向の逆方向のいずれかの方向にある端の画素から前記第1の画素群に含まれる第1の画素までの画素数を取得し、
抽出した前記第2の画素列の中の前記領域に含まれる第2の画素群のうちの前記いずれかの方向にある端の画素から前記いずれかの方向の逆方向に向かって、取得した前記画素数分先の位置にある第2の画素を特定し、
前記画像を変換した場合の前記第1の画素の値を記憶する記憶部を参照して、前記画像を変換した場合の前記第2の画素の値を算出する、
処理をコンピュータに実行させる画像変換プログラムを記録したことを特徴とする記録媒体。
(付記8)変換対象となる画像の中の対象画素列と平行な画素列のうちの、前記対象画素列のいずれかの画素から所定範囲の画素群によって形成される領域と重なる第1の画素列と、前記領域と連続して重なる画素数が前記第1の画素列以上の第2の画素列とを抽出する抽出部と、
前記抽出部によって抽出された前記第1の画素列の中の前記領域に含まれる第1の画素群のうちの前記対象画素列の走査方向または前記走査方向の逆方向のいずれかの方向にある端の画素から前記第1の画素群に含まれる第1の画素までの画素数を取得する取得部と、
前記抽出部によって抽出された前記第2の画素列の中の前記領域に含まれる第2の画素群のうちの前記いずれかの方向にある端の画素から前記いずれかの方向の逆方向に向かって、前記取得部によって取得された前記画素数分先の位置にある第2の画素を特定する特定部と、
前記画像を変換した場合の前記第1の画素の値を記憶する記憶部を参照して、前記画像を変換した場合の前記第2の画素の値を算出する算出部と、
を有することを特徴とする画像変換装置。
(付記9)変換対象となる画像の中の対象画素列と平行な画素列のうちの、前記対象画素列のいずれかの画素から所定範囲の画素群によって形成される領域と重なる第1の画素列と、前記領域と連続して重なる画素数が前記第1の画素列以上の第2の画素列とを抽出する抽出部と、
前記抽出部によって抽出された前記第1の画素列の中の前記領域に含まれる第1の画素群のうちの前記対象画素列の走査方向または前記走査方向の逆方向のいずれかの方向にある端の画素から前記第1の画素群に含まれる第1の画素までの画素数を取得する取得部と、
前記抽出部によって抽出された前記第2の画素列の中の前記領域に含まれる第2の画素群のうちの前記いずれかの方向にある端の画素から前記いずれかの方向の逆方向に向かって、前記取得部によって取得された前記画素数分先の位置にある第2の画素を特定する特定部と、
前記画像を変換した場合の前記第1の画素の値を記憶する記憶部を参照して、前記画像を変換した場合の前記第2の画素の値を算出する算出部と、
を含むコンピュータを有することを特徴とする画像変換装置。
(付記10)コンピュータが、
変換対象となる画像の中の対象画素列と平行な画素列のうちの、前記対象画素列のいずれかの画素から所定範囲の画素群によって形成される領域と重なる第1の画素列と、前記領域と連続して重なる画素数が前記第1の画素列以上の第2の画素列とを抽出し、
抽出した前記第1の画素列の中の前記領域に含まれる第1の画素群のうちの前記対象画素列の走査方向または前記走査方向の逆方向のいずれかの方向にある端の画素から前記第1の画素群に含まれる第1の画素までの画素数を取得し、
抽出した前記第2の画素列の中の前記領域に含まれる第2の画素群のうちの前記いずれかの方向にある端の画素から前記いずれかの方向の逆方向に向かって、取得した前記画素数分先の位置にある第2の画素を特定し、
前記画像を変換した場合の前記第1の画素の値を記憶する記憶部を参照して、前記画像を変換した場合の前記第2の画素の値を算出する、
処理を実行することを特徴とする画像変換方法。
100 画像変換装置
101 絞り形状
301 選択部
302 対象画素列取得部
303 抽出部
304 画素数取得部
305 画素特定部
306 拡散元画素特定部
307 算出部
310 絞り形状テーブル
311 一時記憶領域

Claims (10)

  1. コンピュータに、
    変換対象となる画像の中の対象画素列と平行な画素列のうちの、前記対象画素列のいずれかの画素から所定範囲の画素群によって形成される領域と重なる第1の画素列と、前記領域と連続して重なる画素数が前記第1の画素列以上の第2の画素列とを抽出し、
    抽出した前記第1の画素列の中の前記領域に含まれる第1の画素群のうちの前記対象画素列の走査方向または前記走査方向の逆方向のいずれかの方向にある端の画素から前記第1の画素群に含まれる第1の画素までの画素数を取得し、
    抽出した前記第2の画素列の中の前記領域に含まれる第2の画素群のうちの前記いずれかの方向にある端の画素から前記いずれかの方向の逆方向に向かって、取得した前記画素数分先の位置にある第2の画素を特定し、
    前記画像を変換した場合の前記第1の画素の値を記憶する記憶部を参照して、前記画像を変換した場合の前記第2の画素の値を算出する、
    処理を実行させることを特徴とする画像変換プログラム。
  2. 前記コンピュータに、
    前記対象画素列の中から、前記対象画素列に平行に前記いずれかの画素を移動させた移動後の前記いずれかの画素から前記所定範囲の画素群によって形成される領域内に前記第1の画素が含まれるように、前記対象画素列に平行に前記いずれかの画素を移動させた場合の移動後の前記いずれかの画素と重なる画素を特定し、
    特定した前記画素の値に基づいて、前記画像を変換した場合の前記第1の画素の値を算出する処理を実行させ、
    前記第2の画素の値を算出する処理は、
    算出した前記第1の画素の値に基づいて、前記画像を変換した場合の前記第2の画素の値を算出することを特徴とする請求項1に記載の画像変換プログラム。
  3. 前記コンピュータに、
    前記対象画素列の中から、前記対象画素列に平行に前記いずれかの画素を移動させた移動後の前記いずれかの画素から前記所定範囲の画素群によって形成される領域内に前記第2の画素が含まれるように、前記対象画素列に平行に前記いずれかの画素を移動させた場合の移動後の前記いずれかの画素と重なる画素を特定する処理を実行させ、
    前記第2の画素の値を算出する処理は、
    前記画像を変換した場合の前記第1の画素の値と特定した前記画素の値とに基づいて、前記画像を変換した場合の前記第2の画素の値を算出することを特徴とする請求項1または2に記載の画像変換プログラム。
  4. 前記コンピュータに、
    前記対象画素列の各々の画素ごとに、前記いずれかの方向に向かって、前記各々の画素から前記第1の画素群の画素数分の画素までの各画素の値に基づいて、前記画像を変換した場合の前記第1の画素列に関する前記各々の画素の値を算出し、
    算出した前記第1の画素列に関する前記各々の画素の値のうちの、前記いずれかの画素から前記いずれかの方向の逆方向に向かって、前記第1の画素群の前記いずれかの方向にある端の画素から前記第1の画素までの画素数分先の位置にある画素の値を、前記画像を変換した場合の前記第1の画素の値に設定する処理を実行させ、
    前記第2の画素の値を算出する処理は、
    設定した前記第1の画素の値に基づいて、前記画像を変換した場合の前記第2の画素の値を算出することを特徴とする請求項1〜3のいずれか一つに記載の画像変換プログラム。
  5. 前記コンピュータに、
    前記各々の画素ごとに、前記いずれかの方向に向かって、前記各々の画素から前記第1の画素群の画素数分先の位置にある画素の次の画素から、前記各々の画素から前記第2の画素群の画素数分まで、の各画素の値と、算出した前記第1の画素列に関する前記各々の画素の値とに基づいて、前記画像を変換した場合の前記第2の画素列に関する前記各々の画素の値を算出し、
    前記第2の画素の値を算出する処理は、
    算出した前記第2の画素列に関する前記各々の画素の値のうちの、前記いずれかの画素から前記いずれかの方向の逆方向に向かって、前記第1の画素群の前記いずれかの方向にある端の画素から前記第2の画素までの画素数分先の位置にある画素の値に基づいて、前記画像を変換した場合の前記第2の画素の値を算出することを特徴とする請求項4に記載の画像変換プログラム。
  6. 前記コンピュータに、
    画素群によって形成される領域の形状と、走査方向とを関連付けて記憶するテーブルを参照して、指定された形状に応じた走査方向を選択し、
    前記画像の中から、選択した走査方向に走査して前記対象画素列を取得する処理を実行させ、
    前記対象画素列を取得した後、前記第1の画素列と前記第2の画素列とを抽出する処理を実行することを特徴とする請求項1〜5のいずれか一つに記載の画像変換プログラム。
  7. 変換対象となる画像の中の対象画素列と平行な画素列のうちの、前記対象画素列のいずれかの画素から所定範囲の画素群によって形成される領域と重なる第1の画素列と、前記領域と連続して重なる画素数が前記第1の画素列以上の第2の画素列とを抽出し、
    抽出した前記第1の画素列の中の前記領域に含まれる第1の画素群のうちの前記対象画素列の走査方向または前記走査方向の逆方向のいずれかの方向にある端の画素から前記第1の画素群に含まれる第1の画素までの画素数を取得し、
    抽出した前記第2の画素列の中の前記領域に含まれる第2の画素群のうちの前記いずれかの方向にある端の画素から前記いずれかの方向の逆方向に向かって、取得した前記画素数分先の位置にある第2の画素を特定し、
    前記画像を変換した場合の前記第1の画素の値を記憶する記憶部を参照して、前記画像を変換した場合の前記第2の画素の値を算出する、
    処理をコンピュータに実行させる画像変換プログラムを記録したことを特徴とする記録媒体。
  8. 変換対象となる画像の中の対象画素列と平行な画素列のうちの、前記対象画素列のいずれかの画素から所定範囲の画素群によって形成される領域と重なる第1の画素列と、前記領域と連続して重なる画素数が前記第1の画素列以上の第2の画素列とを抽出する抽出部と、
    前記抽出部によって抽出された前記第1の画素列の中の前記領域に含まれる第1の画素群のうちの前記対象画素列の走査方向または前記走査方向の逆方向のいずれかの方向にある端の画素から前記第1の画素群に含まれる第1の画素までの画素数を取得する取得部と、
    前記抽出部によって抽出された前記第2の画素列の中の前記領域に含まれる第2の画素群のうちの前記いずれかの方向にある端の画素から前記いずれかの方向の逆方向に向かって、前記取得部によって取得された前記画素数分先の位置にある第2の画素を特定する特定部と、
    前記画像を変換した場合の前記第1の画素の値を記憶する記憶部を参照して、前記画像を変換した場合の前記第2の画素の値を算出する算出部と、
    を有することを特徴とする画像変換装置。
  9. 変換対象となる画像の中の対象画素列と平行な画素列のうちの、前記対象画素列のいずれかの画素から所定範囲の画素群によって形成される領域と重なる第1の画素列と、前記領域と連続して重なる画素数が前記第1の画素列以上の第2の画素列とを抽出する抽出部と、
    前記抽出部によって抽出された前記第1の画素列の中の前記領域に含まれる第1の画素群のうちの前記対象画素列の走査方向または前記走査方向の逆方向のいずれかの方向にある端の画素から前記第1の画素群に含まれる第1の画素までの画素数を取得する取得部と、
    前記抽出部によって抽出された前記第2の画素列の中の前記領域に含まれる第2の画素群のうちの前記いずれかの方向にある端の画素から前記いずれかの方向の逆方向に向かって、前記取得部によって取得された前記画素数分先の位置にある第2の画素を特定する特定部と、
    前記画像を変換した場合の前記第1の画素の値を記憶する記憶部を参照して、前記画像を変換した場合の前記第2の画素の値を算出する算出部と、
    を含むコンピュータを有することを特徴とする画像変換装置。
  10. コンピュータが、
    変換対象となる画像の中の対象画素列と平行な画素列のうちの、前記対象画素列のいずれかの画素から所定範囲の画素群によって形成される領域と重なる第1の画素列と、前記領域と連続して重なる画素数が前記第1の画素列以上の第2の画素列とを抽出し、
    抽出した前記第1の画素列の中の前記領域に含まれる第1の画素群のうちの前記対象画素列の走査方向または前記走査方向の逆方向のいずれかの方向にある端の画素から前記第1の画素群に含まれる第1の画素までの画素数を取得し、
    抽出した前記第2の画素列の中の前記領域に含まれる第2の画素群のうちの前記いずれかの方向にある端の画素から前記いずれかの方向の逆方向に向かって、取得した前記画素数分先の位置にある第2の画素を特定し、
    前記画像を変換した場合の前記第1の画素の値を記憶する記憶部を参照して、前記画像を変換した場合の前記第2の画素の値を算出する、
    処理を実行することを特徴とする画像変換方法。
JP2014532643A 2012-08-29 2012-08-29 画像変換プログラム、画像変換装置、および画像変換方法 Expired - Fee Related JP5900625B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/JP2012/071917 WO2014033867A1 (ja) 2012-08-29 2012-08-29 画像変換プログラム、記録媒体、画像変換装置、および画像変換方法

Publications (2)

Publication Number Publication Date
JP5900625B2 JP5900625B2 (ja) 2016-04-06
JPWO2014033867A1 true JPWO2014033867A1 (ja) 2016-08-08

Family

ID=50182717

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2014532643A Expired - Fee Related JP5900625B2 (ja) 2012-08-29 2012-08-29 画像変換プログラム、画像変換装置、および画像変換方法

Country Status (4)

Country Link
US (1) US9615046B2 (ja)
EP (1) EP2892025B1 (ja)
JP (1) JP5900625B2 (ja)
WO (1) WO2014033867A1 (ja)

Families Citing this family (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
KR102377277B1 (ko) * 2015-02-27 2022-03-23 삼성전자주식회사 전자 장치에서 커뮤니케이션 지원 방법 및 장치

Family Cites Families (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP3008681B2 (ja) 1992-07-14 2000-02-14 松下電器産業株式会社 画像ぼかし処理装置
JPH08272960A (ja) * 1995-03-29 1996-10-18 Dainippon Screen Mfg Co Ltd 画像のフィルタリング処理方法
JP2001216513A (ja) 2000-02-01 2001-08-10 Yasumi Ichimura ぼけと絞り形状画像変換装置および方法
JP2004133551A (ja) 2002-10-08 2004-04-30 Noritsu Koki Co Ltd 画像処理方法、画像処理装置、画像処理プログラム、および画像処理プログラムを記録した記録媒体
US20080118175A1 (en) * 2006-11-16 2008-05-22 Barinder Singh Rai Creating A Variable Motion Blur Effect
US20090060387A1 (en) * 2007-09-04 2009-03-05 Microsoft Corporation Optimizations for radius optical blur
JP5220677B2 (ja) * 2009-04-08 2013-06-26 オリンパス株式会社 画像処理装置、画像処理方法および画像処理プログラム
JP5388781B2 (ja) * 2009-09-29 2014-01-15 株式会社東芝 X線コンピュータ断層撮影装置

Also Published As

Publication number Publication date
US20150156436A1 (en) 2015-06-04
US9615046B2 (en) 2017-04-04
WO2014033867A1 (ja) 2014-03-06
EP2892025A4 (en) 2015-08-19
EP2892025A1 (en) 2015-07-08
EP2892025B1 (en) 2017-04-19
JP5900625B2 (ja) 2016-04-06

Similar Documents

Publication Publication Date Title
Yitzhaky et al. Direct method for restoration of motion-blurred images
RU2583730C2 (ru) Адаптивная визуализация изображения и использование фиктивного изображения
KR100924689B1 (ko) 모바일 기기의 이미지 변환 장치 및 방법
JP2021152901A (ja) 画像を生成するための方法及装置
CN114020756A (zh) 遥感影像实时地图服务发布方法和装置
CN111862290B (zh) 一种基于径向模糊的绒毛渲染方法、装置及存储介质
US10930033B1 (en) Content aware tracing for generating vector drawings
US20230078878A1 (en) Systems and methods for coordinate-based search
FR2527405A1 (fr) Procede d'analyse et d'enregistrement d'un motif
JP5900625B2 (ja) 画像変換プログラム、画像変換装置、および画像変換方法
CN113506305A (zh) 三维点云数据的图像增强方法、语义分割方法及装置
US9208546B2 (en) Image processing apparatus, method and imaging apparatus
US10671891B2 (en) Reducing computational costs of deep reinforcement learning by gated convolutional neural network
Sohail et al. Geometric superresolution by using an optical mask
WO2020012139A2 (fr) Procede de visualisation d'elements graphiques issus d'un flux video composite encode
CN112957731B (zh) 画面渲染方法、画面渲染装置及存储介质
Di Staso et al. Heterogeneous-Resolution and multi-source terrain builder for CesiumJS WebGL virtual globe
Eldawy et al. A demonstration of hadoopviz: An extensible mapreduce system for visualizing big spatial data
JP6263024B2 (ja) 画像処理装置、画像処理方法および、プログラム、並びに画像再生装置
CN112991141A (zh) 一种基于gpu并行加速的频域幸运成像方法
Knox Diffraction-limited imaging with astronomical telescopes
JP7111309B2 (ja) 情報処理装置、学習装置、認識装置、静止画の生産方法、およびプログラム
Stasik et al. Extensible implementation of reliable pixel art interpolation
Du et al. Controlled angular and radial scanning for super resolution concentric circular imaging
CN117315172B (zh) 地图页面配置方法、装置、电子设备与计算机可读介质

Legal Events

Date Code Title Description
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20160118

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20160209

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20160222

R150 Certificate of patent or registration of utility model

Ref document number: 5900625

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees