<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>社長のつぶやきメモ帳 &#187; 画像解析</title>
	<atom:link href="https://kandasystem.jp/blog/?cat=1&#038;feed=rss2" rel="self" type="application/rss+xml" />
	<link>https://kandasystem.jp/blog</link>
	<description>カンダシステム株式会社の社長をしている画像解析プログラマーのブログ</description>
	<lastBuildDate>Wed, 19 Jun 2013 01:54:52 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5</generator>
		<item>
		<title>直線補間</title>
		<link>https://kandasystem.jp/blog/?p=78</link>
		<comments>https://kandasystem.jp/blog/?p=78#comments</comments>
		<pubDate>Wed, 19 Jun 2013 01:45:37 +0000</pubDate>
		<dc:creator>sakumat</dc:creator>
				<category><![CDATA[画像解析]]></category>

		<guid isPermaLink="false">http://kandasystem.jp/blog/?p=78</guid>
		<description><![CDATA[補間について少し書いてみます。間を補うと書いて補間。点と点の間を繋ぐ。私がプログラムを書き始めた頃は、直線描画のハードあるいはコードで作っていた。 ｏ点とｐ点を繋ぐ。 Ｘ方向に３、Ｙ方向に５進む。 ● ● ● ● ● ● [...]]]></description>
				<content:encoded><![CDATA[<p>補間について少し書いてみます。間を補うと書いて補間。点と点の間を繋ぐ。私がプログラムを書き始めた頃は、直線描画のハードあるいはコードで作っていた。</p>
<p>ｏ点とｐ点を繋ぐ。</p>
<p lang="ja-JP">Ｘ方向に３、Ｙ方向に５進む。</p>
<dl>
<dd>
<table width="120" border="1" cellspacing="0" cellpadding="4">
<colgroup>
<col width="11" />
<col width="12" />
<col width="12" />
<col width="12" />
<col width="12" />
<col width="11" /></colgroup>
<tbody>
<tr valign="TOP">
<td width="11"></td>
<td width="12"></td>
<td width="12"></td>
<td width="12"></td>
<td width="12"></td>
<td width="11">
<p lang="ja-JP">●</p>
</td>
</tr>
<tr valign="TOP">
<td width="11"></td>
<td width="12"></td>
<td width="12"></td>
<td width="12">
<p lang="ja-JP">●</p>
</td>
<td width="12">
<p lang="ja-JP">●</p>
</td>
<td width="11"></td>
</tr>
<tr valign="TOP">
<td width="11"></td>
<td width="12">
<p lang="ja-JP">●</p>
</td>
<td width="12">
<p lang="ja-JP">●</p>
</td>
<td width="12"></td>
<td width="12"></td>
<td width="11"></td>
</tr>
<tr valign="TOP">
<td width="11">
<p lang="ja-JP">●</p>
</td>
<td width="12"></td>
<td width="12"></td>
<td width="12"></td>
<td width="12"></td>
<td width="11"></td>
</tr>
</tbody>
</table>
</dd>
</dl>
<p>&nbsp;</p>
<p lang="ja-JP">多分上の図が望まれる。</p>
<p lang="ja-JP"> 除算機能のないＣＰＵがまれになった現在では、増分（Ｙ／Ｘ、あるいはＸ／Ｙ）を</p>
<p lang="ja-JP">求めておいて、累積させれば求まる。</p>
<p lang="ja-JP"> 上の例で言うと、増分は３／５（＝Ｙ／Ｘ）となる。</p>
<p lang="ja-JP"> 累積の結果１を超えた場合は上と右へ、超えない場合は右のみへ進める。</p>
<table width="643" border="1" cellspacing="0" cellpadding="4">
<colgroup>
<col width="98" />
<col width="115" />
<col width="64" />
<col width="63" />
<col width="80" />
<col width="173" /></colgroup>
<tbody>
<tr valign="TOP">
<td width="98"></td>
<td width="115">
<p lang="ja-JP">Ｙの累積値</p>
</td>
<td width="64">
<p lang="ja-JP" align="RIGHT">Ｘの座標</p>
</td>
<td width="63">
<p lang="ja-JP" align="RIGHT">Ｙの座標</p>
</td>
<td width="80">
<p lang="ja-JP" align="RIGHT">Ｙの目標値</p>
</td>
<td width="173">
<p lang="ja-JP" align="RIGHT">誤差</p>
</td>
</tr>
<tr valign="TOP">
<td width="98">
<p lang="ja-JP">始点</p>
</td>
<td width="115">
<p lang="ja-JP">０</p>
</td>
<td width="64">
<p lang="ja-JP" align="RIGHT">０</p>
</td>
<td width="63">
<p lang="ja-JP" align="RIGHT">０</p>
</td>
<td width="80">
<p lang="ja-JP" align="RIGHT">０</p>
</td>
<td width="173">
<p lang="ja-JP" align="RIGHT">０</p>
</td>
</tr>
<tr valign="TOP">
<td width="98">
<p lang="ja-JP">１回補間後</p>
</td>
<td width="115">
<p lang="ja-JP">３／５</p>
</td>
<td width="64">
<p lang="ja-JP" align="RIGHT">１</p>
</td>
<td width="63">
<p lang="ja-JP" align="RIGHT">０</p>
</td>
<td width="80">
<p lang="ja-JP" align="RIGHT">３／５</p>
</td>
<td width="173">
<p lang="ja-JP" align="RIGHT">－３／５</p>
</td>
</tr>
<tr valign="TOP">
<td width="98">
<p lang="ja-JP">２回補間後</p>
</td>
<td width="115">
<p lang="ja-JP">６／５－＞１／５</p>
</td>
<td width="64">
<p lang="ja-JP" align="RIGHT"><span style="font-family: Times New Roman, serif;">2</span></p>
</td>
<td width="63">
<p lang="ja-JP" align="RIGHT">１</p>
</td>
<td width="80">
<p lang="ja-JP" align="RIGHT">６／５</p>
</td>
<td width="173">
<p lang="ja-JP" align="RIGHT">－１／５</p>
</td>
</tr>
<tr valign="TOP">
<td width="98">
<p lang="ja-JP">３回補間後</p>
</td>
<td width="115">
<p lang="ja-JP">４／５</p>
</td>
<td width="64">
<p lang="ja-JP" align="RIGHT"><span style="font-family: Times New Roman, serif;">3</span></p>
</td>
<td width="63">
<p lang="ja-JP" align="RIGHT"><span style="font-family: Times New Roman, serif;">1</span></p>
</td>
<td width="80">
<p lang="ja-JP" align="RIGHT">９／５</p>
</td>
<td width="173">
<p lang="ja-JP" align="RIGHT">－４／５</p>
</td>
</tr>
<tr valign="TOP">
<td width="98">
<p lang="ja-JP">４回補間後</p>
</td>
<td width="115">
<p lang="ja-JP">７／５－＞２／５</p>
</td>
<td width="64">
<p lang="ja-JP" align="RIGHT"><span style="font-family: Times New Roman, serif;">4</span></p>
</td>
<td width="63">
<p lang="ja-JP" align="RIGHT"><span style="font-family: Times New Roman, serif;">2</span></p>
</td>
<td width="80">
<p lang="ja-JP" align="RIGHT">１２／５</p>
</td>
<td width="173">
<p lang="ja-JP" align="RIGHT">－２／５</p>
</td>
</tr>
<tr valign="TOP">
<td width="98">
<p lang="ja-JP">４回補間後</p>
</td>
<td width="115">
<p lang="ja-JP">５／５－＞０／５</p>
</td>
<td width="64">
<p lang="ja-JP" align="RIGHT">５</p>
</td>
<td width="63">
<p lang="ja-JP" align="RIGHT">３</p>
</td>
<td width="80">
<p lang="ja-JP" align="RIGHT">１５／５</p>
</td>
<td width="173">
<p lang="ja-JP" align="RIGHT">０</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<dl>
<dd>
<table width="120" border="1" cellspacing="0" cellpadding="4">
<colgroup>
<col width="11" />
<col width="12" />
<col width="12" />
<col width="12" />
<col width="12" />
<col width="11" /></colgroup>
<tbody>
<tr valign="TOP">
<td width="11"></td>
<td width="12"></td>
<td width="12"></td>
<td width="12"></td>
<td width="12"></td>
<td width="11">
<p lang="ja-JP">●</p>
</td>
</tr>
<tr valign="TOP">
<td width="11"></td>
<td width="12"></td>
<td width="12"></td>
<td width="12"></td>
<td width="12">
<p lang="ja-JP">●</p>
</td>
<td width="11"></td>
</tr>
<tr valign="TOP">
<td width="11"></td>
<td width="12"></td>
<td width="12">
<p lang="ja-JP">●</p>
</td>
<td width="12">
<p lang="ja-JP">●</p>
</td>
<td width="12"></td>
<td width="11"></td>
</tr>
<tr valign="TOP">
<td width="11">
<p lang="ja-JP">●</p>
</td>
<td width="12">
<p lang="ja-JP">●</p>
</td>
<td width="12"></td>
<td width="12"></td>
<td width="12"></td>
<td width="11"></td>
</tr>
</tbody>
</table>
</dd>
</dl>
<p> となる。</p>
<p lang="ja-JP">少し変ですね。</p>
<p lang="ja-JP"> これは丸め処理<span style="font-family: Times New Roman, serif;">(</span>四捨五入）が入ってないためです。</p>
<p lang="ja-JP"> 丸め処理を入れる。</p>
<p lang="ja-JP"> 累積結果に１／２を加えて判定すればよい。累積の初期値を１／２とする。</p>
<table width="643" border="1" cellspacing="0" cellpadding="4">
<colgroup>
<col width="75" />
<col width="224" />
<col width="68" />
<col width="73" />
<col width="83" />
<col width="70" /></colgroup>
<tbody>
<tr valign="TOP">
<td width="75"></td>
<td width="224">
<p lang="ja-JP">Ｙの累積値</p>
</td>
<td width="68">
<p lang="ja-JP" align="RIGHT">Ｘの座標</p>
</td>
<td width="73">
<p lang="ja-JP" align="RIGHT">Ｙの座標</p>
</td>
<td width="83">
<p lang="ja-JP" align="RIGHT">Ｙの目標値</p>
</td>
<td width="70">
<p lang="ja-JP" align="RIGHT">誤差</p>
</td>
</tr>
<tr valign="TOP">
<td width="75">
<p lang="ja-JP">始点</p>
</td>
<td width="224">
<p lang="ja-JP">１／２（初期値）</p>
</td>
<td width="68">
<p lang="ja-JP" align="RIGHT">０</p>
</td>
<td width="73">
<p lang="ja-JP" align="RIGHT">０</p>
</td>
<td width="83">
<p lang="ja-JP" align="RIGHT">０</p>
</td>
<td width="70">
<p lang="ja-JP" align="RIGHT">０</p>
</td>
</tr>
<tr valign="TOP">
<td width="75">
<p lang="ja-JP">１回補間後</p>
</td>
<td width="224">
<p lang="ja-JP">１／２＋３／５－＞１／１０＋１</p>
</td>
<td width="68">
<p lang="ja-JP" align="RIGHT">１</p>
</td>
<td width="73">
<p lang="ja-JP" align="RIGHT"><span style="font-family: Times New Roman, serif;">1</span></p>
</td>
<td width="83">
<p lang="ja-JP" align="RIGHT">３／５</p>
</td>
<td width="70">
<p lang="ja-JP" align="RIGHT">＋２／５</p>
</td>
</tr>
<tr valign="TOP">
<td width="75">
<p lang="ja-JP">２回補間後</p>
</td>
<td width="224">
<p lang="ja-JP">１／１０＋３／５－＞７／１０＋０</p>
</td>
<td width="68">
<p lang="ja-JP" align="RIGHT"><span style="font-family: Times New Roman, serif;">2</span></p>
</td>
<td width="73">
<p lang="ja-JP" align="RIGHT">１</p>
</td>
<td width="83">
<p lang="ja-JP" align="RIGHT">６／５</p>
</td>
<td width="70">
<p lang="ja-JP" align="RIGHT">－１／５</p>
</td>
</tr>
<tr valign="TOP">
<td width="75">
<p lang="ja-JP">３回補間後</p>
</td>
<td width="224">
<p lang="ja-JP">７／１０＋３／５－＞３／１０＋１</p>
</td>
<td width="68">
<p lang="ja-JP" align="RIGHT"><span style="font-family: Times New Roman, serif;">3</span></p>
</td>
<td width="73">
<p lang="ja-JP" align="RIGHT"><span style="font-family: Times New Roman, serif;">2</span></p>
</td>
<td width="83">
<p lang="ja-JP" align="RIGHT">９／５</p>
</td>
<td width="70">
<p lang="ja-JP" align="RIGHT">＋１／５</p>
</td>
</tr>
<tr valign="TOP">
<td width="75">
<p lang="ja-JP">４回補間後</p>
</td>
<td width="224">
<p lang="ja-JP">３／１０＋３／５－＞９／１０＋０</p>
</td>
<td width="68">
<p lang="ja-JP" align="RIGHT"><span style="font-family: Times New Roman, serif;">4</span></p>
</td>
<td width="73">
<p lang="ja-JP" align="RIGHT"><span style="font-family: Times New Roman, serif;">2</span></p>
</td>
<td width="83">
<p lang="ja-JP" align="RIGHT">１２／５</p>
</td>
<td width="70">
<p lang="ja-JP" align="RIGHT">－２／５</p>
</td>
</tr>
<tr valign="TOP">
<td width="75">
<p lang="ja-JP">４回補間後</p>
</td>
<td width="224">
<p lang="ja-JP">９／１０＋３／５－＞０／１０＋０</p>
</td>
<td width="68">
<p lang="ja-JP" align="RIGHT">５</p>
</td>
<td width="73">
<p lang="ja-JP" align="RIGHT">３</p>
</td>
<td width="83">
<p lang="ja-JP" align="RIGHT">１５／５</p>
</td>
<td width="70">
<p lang="ja-JP" align="RIGHT">０</p>
</td>
</tr>
</tbody>
</table>
<p>&nbsp;</p>
<dl>
<dd>
<table width="120" border="1" cellspacing="0" cellpadding="4">
<colgroup>
<col width="11" />
<col width="12" />
<col width="12" />
<col width="12" />
<col width="12" />
<col width="11" /></colgroup>
<tbody>
<tr valign="TOP">
<td width="11"></td>
<td width="12"></td>
<td width="12"></td>
<td width="12"></td>
<td width="12"></td>
<td width="11">
<p lang="ja-JP">●</p>
</td>
</tr>
<tr valign="TOP">
<td width="11"></td>
<td width="12"></td>
<td width="12"></td>
<td width="12">
<p lang="ja-JP">●</p>
</td>
<td width="12">
<p lang="ja-JP">●</p>
</td>
<td width="11"></td>
</tr>
<tr valign="TOP">
<td width="11"></td>
<td width="12">
<p lang="ja-JP">●</p>
</td>
<td width="12">
<p lang="ja-JP">●</p>
</td>
<td width="12"></td>
<td width="12"></td>
<td width="11"></td>
</tr>
<tr valign="TOP">
<td width="11">
<p lang="ja-JP">●</p>
</td>
<td width="12"></td>
<td width="12"></td>
<td width="12"></td>
<td width="12"></td>
<td width="11"></td>
</tr>
</tbody>
</table>
</dd>
</dl>
<p> となる。</p>
<p lang="ja-JP"> さてコードだが、右へｒ、上へｕ進ませる場合（２点間の距離が［ｒ、ｕ］）、増分ｕ／ｒを求める必要がある。</p>
<p lang="ja-JP"> ｒ／ｕの性質上Ｒｅａｌ（ｆｌｏａｔ，ｄｏｕｂｌｅ）を使いたくなるが、整数演算で間に合わす。</p>
<p lang="ja-JP">補間の距離に依存するが、２の１６乗未満の画素数なら、１６ビットのｕｎｓｉｇｎｅｄで足りる。</p>
<p lang="ja-JP">増分は１６ビットの下駄を履かせて演算する。</p>
<p lang="ja-JP"> ａ<span style="font-family: Times New Roman, serif;">=</span>６５５３６<span style="font-family: Times New Roman, serif;">×</span>ｕ／ｒ</p>
<p lang="ja-JP"> こうすると、Ｍｓｂ（最上位ビット）が１／２となる。</p>
<p lang="ja-JP"> 同様に初期値１／２は３２７６８となる。</p>
<p lang="ja-JP"> この初期値にａを累積させ、Ｘを１画素進めた時にＹを増加させるかをキャリーで判定する。</p>
<p lang="ja-JP"> しかし、キャリービットを検知する言語でない場合、累積値の減少を判定する。</p>
<p lang="ja-JP">ｓａｍｐｌｅ　ｃｏｄｅ</p>
<p lang="ja-JP"> <span style="font-family: Times New Roman, serif;">void LineInterpolation( Cpoint p0, CPoint p1)</span></p>
<p lang="ja-JP"><span style="font-family: Times New Roman, serif;">{</span></p>
<p lang="ja-JP" style="padding-left: 30px;"><span style="font-family: Times New Roman, serif;"> CPoint d= p1 – p0;</span></p>
<p lang="ja-JP" style="padding-left: 30px;"><span style="font-family: Times New Roman, serif;"> if ( d.x == 0 &amp;&amp; d.y == 0 ) { return; }</span></p>
<p style="padding-left: 30px;"><span style="font-family: Times New Roman, serif;"> unsigned short a= 65536 * d.y / d.x; // </span>１６ビットの下駄を履かせて増分算出</p>
<p style="padding-left: 30px;"><span style="font-family: Times New Roman, serif;"> unsigned short ds=  0&#215;8000; // </span>初期値を１／２に</p>
<p lang="ja-JP" style="padding-left: 30px;"><span style="font-family: Times New Roman, serif;"> Cpoint p;</span></p>
<p style="padding-left: 30px;"><span style="font-family: Times New Roman, serif;"> for( p= p0; p != p1; p.x++ ) { // </span>Ｘ方向歩進</p>
<p style="padding-left: 60px;"><span style="font-family: Times New Roman, serif;"> //</span>　ここに補間点ｐに対する処理を入れる。</p>
<p style="padding-left: 60px;"><span style="font-family: Times New Roman, serif;"> If ( ds + a &lt; ds ) { p.y++; } // </span>キャリー判定とＹ方向歩進</p>
<p style="padding-left: 60px;"><span style="font-family: Times New Roman, serif;"> ds += a; // </span>誤差の更新</p>
<p lang="ja-JP" style="padding-left: 30px;"><span style="font-family: Times New Roman, serif;"> }</span></p>
<p lang="ja-JP"><span style="font-family: Times New Roman, serif;">}</span></p>
<p lang="ja-JP">これはモデルであり、使えるのは</p>
<p><span style="font-family: Times New Roman, serif;"> r&gt;=0 &amp;&amp; u&gt;=0 &amp;&amp; |r|&gt;=|u|</span>、すなわち０～４５度の区間に限る。</p>
<p lang="ja-JP"> 老婆心ながら付け加えると、４５～９０度の区間はＸ座標とＹ座標を入れ替えればよい。</p>
<p lang="ja-JP">更に、－４５度～０度の区間であれば、Ｙの符号を反転しＹ方向の増分を－１とする。</p>
<p lang="ja-JP">他の区間も同様で、Ｘ，Ｙの入れ替えと増分の符号反転で対応すればよい。</p>
<p lang="ja-JP">お気づきかもしれないが、このコードでは終点は描画されない。</p>
<p lang="ja-JP"> これは、Ｏｎ　ｐｕｒｐｏｓｅ！</p>
<p lang="ja-JP"> ちょっとした意味があります。</p>
<p lang="ja-JP"> 次回、円弧補間を書くつもりですのでその時に。</p>
]]></content:encoded>
			<wfw:commentRss>https://kandasystem.jp/blog/?feed=rss2&#038;p=78</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>金と力が</title>
		<link>https://kandasystem.jp/blog/?p=73</link>
		<comments>https://kandasystem.jp/blog/?p=73#comments</comments>
		<pubDate>Fri, 07 Jun 2013 09:56:02 +0000</pubDate>
		<dc:creator>sakumat</dc:creator>
				<category><![CDATA[画像解析]]></category>

		<guid isPermaLink="false">http://kandasystem.jp/blog/?p=73</guid>
		<description><![CDATA[最近２，３の問題が持ち込まれた。残念ながら何れも解けていない。今日はその内の１つの問題の解を得ようと、知人の会社を訪ねた。結果はＸ。透明フィルムの凹凸を検出したいという事。 現在は、人間が、蛍光灯にかざし検査している。そ [...]]]></description>
				<content:encoded><![CDATA[<p>最近２，３の問題が持ち込まれた。残念ながら何れも解けていない。今日はその内の１つの問題の解を得ようと、知人の会社を訪ねた。結果はＸ。透明フィルムの凹凸を検出したいという事。 現在は、人間が、蛍光灯にかざし検査している。その作業も、慣れている人にしか出来ない様である。しかし、干渉顕微鏡であればよく見えるという。少しそちらを調べてみるか。 画像を扱う場合の大きなテーマは、「精度と処理速度を如何に保つか」であろう。精度を上げるためには、視野が狭くなる。被計測物の大きさ／視野の大きさ＝取り込み画像数。 今日の被検査物は、１ｍＸ１．５ｍ程の大きさである。１回の視野は２００万画素のカメラで検出精度を考えるとせいぜい大きくしても２ｍｍ程度。 １ｍＸ１．５ｍ／（２ｍｍＸ２ｍｍ）≒４０万回となる。 ３０フレーム／毎秒でとると、凡そ１３０００秒＝３時間半。これでは。。。 もうひとつの別のテーマでは、十分な大きさがあり、すでに画像として取り込めている。電子顕微鏡画像であるが、そこに映し出されている画像からの輪郭抽出をしたい。 人間が見れば、確かに輪郭はあるのだが、場所によって濃度差はまちまちである。ゾーベル等、幾つかのフィルターをかけてみたが、人間のように上手くは切り出せない。 自分自身で輪郭が見えるのであるから、それを計算機に教えてやればよいわけだが。悲しいかな、それを明確に述べることが出来ない。確かにある部分はうっすらと暗い線が見える。 であれば、周囲との濃度差で見つけられそうだが。こういったジレンマは、苦痛であるが同時にそれを解けたときの喜びは。 可能であれば１年ほどのコストを掛けて（賭けて）見たいものであるが。</p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>https://kandasystem.jp/blog/?feed=rss2&#038;p=73</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
