ScanSnap iX1300のカラー解像度が白黒の半分になる理由

Share

はじめに

PFUのドキュメントスキャナー ScanSnap iX1300の自動画質モード(Best)では、カラーと白黒で読み取り解像度が異なる。

原稿の短辺が約105mm以下の場合は、カラー/グレー300dpi、白黒600dpi相当に設定。原稿の短辺が約105mmよりも長い場合は、カラー/グレー200dpi、白黒400dpi相当に設定。

どの条件でも白黒はカラーのちょうど2倍の解像度である。光学解像度は600dpiと記載されているにもかかわらず、なぜカラーではその性能をそのまま発揮できないのか。本記事では、iX1300が採用するCISセンサーの仕組みからその理由を解説する。

なお、iX1300は手動で「Excellent」モードを選択すればカラー600dpi(白黒1200dpi相当)でのスキャンにも対応している。ただしスキャン速度は大幅に低下する(Best:30枚/分 → Excellent:9枚/分)。本記事で扱うのは、速度を維持する自動画質モードでなぜ解像度が制限されるかという問題である。

参考:ScanSnap iX1300 | PFU


CISセンサーの基本構造

iX1300のイメージセンサーは CIS(Contact Image Sensor) である。デジタルカメラで一般的なCCD/CMOSセンサーが2次元配列の素子でレンズ越しに「面」を撮影するのに対し、CISは原稿幅に沿って 1列に並んだセンサー素子 で「線」を読み取り、紙送りによって2次元画像を構成する。

CISの主な特徴は以下のとおりである。

  • 原稿に密着し、ロッドレンズアレイ(屈折率分布型の微小レンズ群)で等倍結像する
  • 光学系が単純なため、センサーユニット全体を10mm以下に薄型化できる
  • 低消費電力・低コストで、コンパクトスキャナーに適している

イメージセンサーは単体では色を認識できない

イメージセンサーのフォトダイオードは、入射光の強度に応じた電荷を生成する半導体素子である。光の「強さ」は検出できるが、「波長(色)」は区別できない。センサー単体の出力はモノクロの明暗情報のみであり、カラー画像を得るには光を色成分に分離する工夫が必要になる。

主な方式は2つある。

  1. センサー側で分離する方式:各センサー素子の前にRGB色フィルターを配置する(デジタルカメラのベイヤー配列が代表例)
  2. 光源側で分離する方式:異なる色の光を順番に照射し、同一センサーで色ごとの反射光を測定する

iX1300は後者の 順次照明方式(Sequential Illumination) を採用している。仕様に「光源:RGB 3色LED」と記載されていることがその根拠である。


順次照明方式によるカラー読み取り

iX1300のCISセンサー素子には色フィルターがない。代わりに、RGB 3色のLEDを時間的に切り替えて照明することでカラー情報を取得する。

1ラインのカラー読み取りは以下の手順で行われる。

  1. 赤LEDのみ点灯 → 原稿からの赤色反射光をセンサーが読み取る
  2. 緑LEDのみ点灯 → 緑色反射光を読み取る
  3. 青LEDのみ点灯 → 青色反射光を読み取る
  4. 3チャンネルのデータを合成し、そのラインのカラー画像を生成する

たとえば原稿上に赤い部分がある場合、赤LED照明時にはセンサーが強い反射を検出し、緑・青LED照明時には弱い反射を検出する。3色の測定値の差分から色を判定できるという原理である。


カラー解像度が制限される理由

読み取り回数と速度の制約

白黒スキャンでは全LEDを同時点灯し、1回の読み取りで1ラインが完了する。一方カラースキャンでは、同じ1ラインに対してR・G・Bの 3回の読み取り が必要になる。

センサーの読み取り速度(単位時間あたりの読み取り回数)にはハードウェア上の上限がある。同じスキャン速度(枚/分)を維持する場合、カラーでは1ラインあたり3回の読み取りを消費するため、同じ時間内に処理できるライン数が減少する。これが副走査方向(紙送り方向)の解像度低下に直結する。

iX1300のBestモードでは、カラー・白黒ともにスキャン速度は30枚/分で同一である。同じ紙送り速度のもとで、白黒は1読み取り=1ラインであるのに対し、カラーは3読み取り=1ラインである。同一のセンサー読み取り速度でカバーできるライン密度が異なるため、カラーでは解像度が低くなる。

紙送り中のRGB位置ずれ

速度の制約に加えて、物理的な問題もある。iX1300はシートフィードスキャナーであり、スキャン中に原稿が連続的に移動している。R・G・Bの読み取りは時間差で行われるため、厳密には各色が原稿上のわずかに異なる位置を読み取っていることになる。

この位置ずれは、解像度を下げる(1ピクセルあたりの物理サイズを大きくする)ことで相対的に小さくなり、実用上無視できるレベルに収まる。カラー解像度を白黒より低く設定することは、このRGB間の位置ずれを許容範囲に吸収するうえでも合理的である。


白黒スキャンで高解像度が可能な理由

白黒(モノクロ2値)スキャンでは、RGB全LEDを同時に白色光として点灯するため、1回の読み取りでラインが完了する。LED色の切り替えに起因する時間差も位置ずれも発生しない。その結果、センサーの光学解像度(600dpi)をそのまま出力に活用できる。

グレースケールの解像度について

仕様上、グレースケールもカラーと同じ解像度(300dpiまたは200dpi)に制限されている。これは、グレースケールモードでもRGB 3色を個別に読み取ったうえで輝度値を算出している可能性を示唆する。各色LEDの発光スペクトルには固有の偏りがあるため、全色同時点灯だけでは均一な照明が得られにくく、3色個別読み取りにより正確な階調表現が得られる。その代償として、カラーと同じ時間的制約を受けることになる。


原稿サイズによる解像度の違い

仕様では原稿の短辺が105mmを超えると解像度がさらに低下する(カラー200dpi、白黒400dpi)。これはデータ量と処理能力のトレードオフによるものである。

原稿が大きくなるほどページ全体のライン数とデータ量が増加する。たとえばA4(210×297mm)と名刺(55×91mm)ではスキャン面積に約10倍の差があり、同じ解像度ではデータ量も比例して増大する。限られたバッファメモリ・プロセッサ性能・USB転送帯域の中でスキャン速度を維持するには、大きな原稿では解像度を下げる必要がある。

105mmという閾値は、名刺(55×91mm)やハガキ(100×148mm)といった小型原稿を高解像度側に含め、A4以上の原稿を低解像度側に分類する実用的な境界として設定されていると考えられる。


まとめ

iX1300の「白黒600dpi、カラー300dpi」という自動画質モードの仕様は、CISセンサーの順次照明方式に起因する合理的な設計判断である。

  • カラー読み取りではR・G・B各色を時間差で3回読み取る必要があり、白黒に比べて1ラインあたり3倍の読み取り回数を要する
  • 同じスキャン速度を維持するため、カラーでは副走査方向の解像度を下げている
  • シートフィード中のRGB位置ずれも、解像度を下げることで許容範囲に収まる
  • 白黒では全LED同時点灯による1回読み取りで完了するため、光学解像度をそのまま活用できる
  • 原稿サイズが大きい場合は、データ処理量の制約からさらに解像度が制限される

一般的な文書スキャン用途であれば300dpiカラーで十分実用的である。高解像度が必要な場合はExcellentモードでカラー600dpiを選択できる。写真やアート作品の高品質スキャンなど、さらに高い品質を求める場合はCCD方式のフラットベッドスキャナーが適している。

参考:ScanSnap iX1300 | PFU

Read more

Dependabotの対応が面倒なのでRenovateを導入する

Dependabotくんはある程度の依存関係の更新を通知してくれるが、山のようにprojectを抱えているとなんとも痒いところに手が届かない。 ということで、Renovateを使ってみる。 Build software better, togetherGitHub is where people build software. More than 150 million people use GitHub to discover, fork, and contribute to over 420 million projects.GitHub ここからGitHub Appを入れる。 あとは、指示に従ってポチポチするだけで、超かんたんだった。 感想 自動化最高。

By Sakashita Yasunobu

nodejsのバグを見つけたのでPRを投げてみた

概要 要するに、node --testで特定のバイナリを標準出力に書くと、テストランナーが固まったり、異常終了したりするバグです。 バグ自体は既知のものだったようで、修正がされていました。 test_runner: infinite loop in FileTest#drainRawBuffer when child stdout contains FF 0F followed by large size bytes · Issue #62693 · nodejs/nodeVersion v25.9.0 (also reproduced on v24.14.1 LTS, v22.21.0 LTS, v23.4.0) Platform Darwin 25.

By Sakashita Yasunobu
青空文庫のParser

青空文庫のParser

青空文庫のParserを作ってます。 GitHub - P4suta/aozora: Pure-functional Rust parser for 青空文庫記法 (Aozora Bunko notation): ルビ, 傍点, 縦中横, 外字, 返り点, indent containers, page breaks.Pure-functional Rust parser for 青空文庫記法 (Aozora Bunko notation): ルビ, 傍点, 縦中横, 外字, 返り点, indent containers, page breaks. - P4suta/aozoraGitHubP4suta Rustで作ってますが、配布物はcargoのほかにnpm/pypiでも入手できます Documentation * Playground — try it in

By Sakashita Yasunobu